2017-01-20 4 views
1

linux mintでg ++コンパイラを使用しています。 私はニューラルネットワークの魔法使いのためのクラスを作ることに結びついています。私はティックタックのつま先をしたいです。 マイヘッダー:クラスファイルをインクルードした後のエラーメッセージ(複数定義されたシンボル)

#ifndef tttAi 
#define tttAi 
#include <string> 

class Synaps{ 
public: 
    explicit Synaps(const std::string& n, double v); 
    void add(double ad); 
    void multi(double mu); 
    void save(); 
    double read(); 
private: 
    std::string name; 
    double Syn_value; 
}; 
#endif 

私の機能は以下のとおりです。

#include "tttAi.h" 
#include <fstream> 
#include <string> 

Synaps::Synaps(const std::string& n, double v) 
:name(n), Syn_value(v){ 
} 

void Synaps::add(double ad) { //change by addition 
    Syn_value += ad; 
} 

void Synaps::multi(double multip) { //change by multiplication 
    Syn_value *= multip; 
} 

double Synaps::read() { 
    return Syn_value; 
} 

そして、ここでは、私はそれがやりたいことです:使用

#include <iostream> 

#include "tttAi.h" 
#include "tttAi.cpp" 

int main() { 
Synaps n1n6("n1n6", 75); 
n1n6.multi(2); 

std::cout << n1n6.read() << '\n'; 
/*Want it to just output the value of Syn_value Witch at 
this point should be 150 if i have done everything right*/ 
} 

コマンド:G ++ -Wall -std = C + +14 * cpp

だから私は私が得ると思うと思うのは、150のコンソール出力でしたが、コンパイルするとこのe ndlessエラーメッセージ: enter image description here

あなたは私が間違っていたアイデアを持っていると思います。

+0

スクリーンショットを投稿するのではなく、エラーメッセージをここにコピーして貼り付けてください。 –

答えて

3

を含めるべきではありません。

ファイルを含めるということは、そのファイルの内容を含める時点で複製することを意味します(したがって、定義も複製します)。

+0

ODRは何を意味していますか?私は、説明なしで省略形を使うことはC++の初心者に役立つよりも混乱していると思います。 –

+0

@SingerOfTheFall、ダブルルールのおかげで申し訳ありません。より多くの文脈を追加しました。 –

1

問題は、main.cppファイルに#include "tttAi.cpp"と表示されるようです。 あなたが定義を含むCPPファイルを複数回含む(すなわち、あなたはmain.cppをファイルに

#include "tttAi.cpp" 

を書くべきではありません)ので、ODR - one definition ruleに違反しているのcppファイルに

0

#include .cppファイルを使用しないでください。代わりに、コンパイル時にコマンドラインでそれらをリストしてください。

関連する問題