鍍金池/ 問答/C++  HTML/ 這個錯誤時什么原因造成的

這個錯誤時什么原因造成的

1.定義一個頭文件:各種類.h

include "stdafx.h"

include<stdio.h>

class x;
class y
{

public:
    void g(x &x1);

};

class x
{

private:
    int i;
public:
    x(int i=0)
    {
        this->i=i;
    }
    void show_i()
    {
        printf("i=%d\n",i);
    }
    friend void y::g(x &x1);
    friend class z;
    friend void h(x &x1);

};

void y::g(x &x1)
{

x1.i++;

}
class z
{

public:
    void f(x &x1)
    {
        x1.i+=5;
    }

};
void h(x &x1)
{

x1.i+=10;

}

2.在另一個test.app中執(zhí)行

include "stdafx.h"

include<stdio.h>

include"各種類.h"

int _tmain(int argc, _TCHAR* argv[])
{

x x1;
y y1;
y1.g(x1);
x1.show_i();
z z1;
z1.f(x1);
x1.show_i();
h(x1);
x1.show_i();
return 0;

}

3.然后就報錯了:fatal error LNK1169: 找到一個或多個多重定義的符號
我看參考答案就是這樣寫的,為什么我的就出錯?
上網(wǎng)看了別人的解釋,總感覺跟我的情況不一樣,這樣該怎么改正?

圖片描述

回答
編輯回答
醉淸風(fēng)

1169行代碼是什么,直接看1169行,或者找到1169行對應(yīng)的未編譯文件位置找錯誤

2017年5月9日 07:06
編輯回答
女流氓

把你的代碼排版好OK?
在.h中直接定義y::g()以及h()的函數(shù)體就是這樣的效果。
你的兩個cpp文件將各種類.h分別包含一次,那兩個cpp文件各自都有了一份函數(shù)體,這不就沖突了嗎?
不是不能在.h中直接定義函數(shù)體。這樣做可以,但得小心謹(jǐn)慎,避免出現(xiàn)一h事二cpp。

三個解決方案:

  1. 不要各種類.cpp這個文件,避免兩個cpp包含同一個各種類.h
  2. 保留各種類.cpp這個文件,但把y::g()h()的定義在各種類.cpp中,不要讓test.cpp看到。
  3. y::g()h()定義為inline的,讓兩個cpp雖然各持有一份函數(shù)體,但是忘掉它們的名字。
2017年2月22日 14:43