ページ 11

未解決の外部シンボル(T_ChangeNum(int))が参照されました

Posted: 2018年6月14日(木) 01:42
by 遊び人
以下のようにプロジェクトを分割した際、test.cppを読み取ってくれずタイトルにあるエラーがでてしまいました。
どのようにすれば正常に動作するのでしょうか?

コード:

//main.cpp
#include <iostream>
#include "test.h"
using namespace std;

int main() {
	Test test;

	test.T_ChangeNum(4);
	cout << test.T_GiveNum() << endl;

	return 0;
}

// test.h
#pragma once
#include <iostream>

class Test {
private:
	int T_num;
public:
	void T_ChangeNum(int);
	int T_GiveNum() const { return T_num; }
};

// test.cpp
#pragma once
#include "test.h"

inline void Test::T_ChangeNum(int number) {
	T_num = number;
}

Re: 未解決の外部シンボル(T_ChangeNum(int))が参照されました

Posted: 2018年6月14日(木) 04:59
by maru
test.cpp の inline が余分です。意味を考えてみて下さい。

Re: 未解決の外部シンボル(T_ChangeNum(int))が参照されました

Posted: 2018年6月15日(金) 00:17
by 遊び人
inlineはヘッダファイルのみで実装するのですね、失念しておりました。
しかしこれでは、若干動作が遅くなってしまうのではないでしょうか。

Re: 未解決の外部シンボル(T_ChangeNum(int))が参照されました

Posted: 2018年6月15日(金) 01:03
by かずま
なぜ T_ChangeNum と T_GiveNum で異なる書き方をするんですか?
次のようにすれば、test.cpp は要らないし、遅くもならないでしょう。

test.h

コード:

class Test {
	int T_num;
public:
	void T_ChangeNum(int number) { T_num = number; }
	int T_GiveNum() const { return T_num; }
};

Re: 未解決の外部シンボル(T_ChangeNum(int))が参照されました

Posted: 2018年6月15日(金) 07:51
by maru
遊び人 さんが書きました:
5年前
しかしこれでは、若干動作が遅くなってしまうのではないでしょうか。
性能を気にして inline を維持したいのならば、かずまさんが書いているように、
クラス定義内に関数の実体を書く、またはクラス定義の直後に inline キーワードを
つけた関数定義を書けばいいでしょう。

コード:

class Test {
	int T_num;
public:
	void T_ChangeNum(int number);
	int T_GiveNum() const { return T_num; }
}

inline void Test::T_ChangeNum(int number) {
	T_num = number;
}
inline を維持したまま関数呼び出しと関数定義を別のコンパイル単位(main.cppとtest.cpp)にすることは両立しないかと。

Re: 未解決の外部シンボル(T_ChangeNum(int))が参照されました

Posted: 2018年6月16日(土) 19:58
by 遊び人
大きなクラスを作る際(今回はテスト用なので小さいですが)、ごちゃごちゃして見づらくなってしまうと考え、ファイルを分割しておりました。
やはり同じファイルにまとめて書いた方がよさそうです、ありがとうございました。