1

tryME 関数を使用して C++ クラスを定義するこれら 2 つの単純なファイルがあります。

______myclass.h________________
#pragma once

void tryME()
{

}

class myclass
{
public:
    myclass(void);
    myclass(void);


    void callTryME();
};

_________myclass.cpp____________

#include "myclass.h"


myclass::myclass(void)
{
}


myclass::~myclass(void)
{
}

void myclass::callTryME()
{
    tryME();
}

これにより、エラーが発生します

1>myclass.obj : エラー LNK2005: "void __cdecl TryME(void)" (?TryME@@YAXXZ) は既に tryout.obj で定義されています 1>C:\tryout.exe : 致命的なエラー LNK1169: 1 つ以上の多重定義されたシンボルが見つかりました

tryME() 関数を static として宣言すると、問題は解決します。しかし、なぜ?

.h ファイルが .cpp ファイルに含まれてから (翻訳単位に) コンパイルされ、静的変数と関数が含まれている翻訳単位全体に表示されることはわかっていますが、プログラムが機能しないのはなぜですか「静的」キーワードなしですか?関数 tryME は、クラス外で「グローバル」であるべきであり、したがって可視である必要があります。それは正しくありませんか? 呼び出しは tryME() の前に「this->」を置きますか?

4

3 に答える 3

1

これ:

inline void tryME()
{

}

それ以外の場合は、単一定義規則に違反しています。

ヘッダーファイルで非メソッドを定義するinlineと、そのヘッダーを含むすべての変換ユニットによってエクスポートされ、エラーが発生します。

于 2012-04-10T21:53:11.340 に答える
1

それは確かに目に見える。ヘッダーファイルをロードするすべてのファイルで個別の定義として表示されるため、リンク時にリンカーはすべて同じ名前の複数の関数に直面し、使用する意図がわからないと正しく不平を言います。

ヘッダー ファイルで関数を定義しないでください。それらを宣言することは良いことです。それらを定義しますが、それほどではありません。

于 2012-04-10T21:55:04.617 に答える
1

関数の宣言と定義は、ヘッダー ファイルとソース ファイルで分離できます。あなたの場合、tryMe() 定義を「myclass.h」から「myclass.cpp」に移動し、「myclass.h」に tryMe() の宣言のみを残すことができます。他の回答で既に述べたように、他の方法は「インライン」キーワードを使用することです。

于 2012-04-11T13:28:13.343 に答える