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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
遊び人
記事: 42
登録日時: 6年前

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

#1

投稿記事 by 遊び人 » 5年前

以下のようにプロジェクトを分割した際、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;
}

maru
記事: 150
登録日時: 13年前

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

#2

投稿記事 by maru » 5年前

test.cpp の inline が余分です。意味を考えてみて下さい。

遊び人
記事: 42
登録日時: 6年前

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

#3

投稿記事 by 遊び人 » 5年前

inlineはヘッダファイルのみで実装するのですね、失念しておりました。
しかしこれでは、若干動作が遅くなってしまうのではないでしょうか。

かずま

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

#4

投稿記事 by かずま » 5年前

なぜ 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; }
};

maru
記事: 150
登録日時: 13年前

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

#5

投稿記事 by maru » 5年前

遊び人 さんが書きました:
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)にすることは両立しないかと。

遊び人
記事: 42
登録日時: 6年前

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

#6

投稿記事 by 遊び人 » 5年前

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

返信

“C言語何でも質問掲示板” へ戻る