2016-09-29 2 views
-1

私が間違っていることがわからない、誰かが正しい方向に私を向けることを望んでいた。顧客クラスを作成しましたが、初期化できません。C++でオブジェクトを初期化する際に問題がある - Linux

customer.h

#ifndef CUSTOMER_H 
#define CUSTOMER_H 

#include "defs.h" 
#include <string> 
using namespace std; 

class Customer 
{ 
    public: 
    Customer(string fName, string lName); 
    string  getFirstName(); 
    string  getLastName(); 
    int  getCustID(); 
    int  getNumAccounts(); 

    protected: 
    string  firstName; 
    string  lastName; 
    int  custID; 
    int  numAccounts; 

}; 

#endif 

customer.cc

#include "defs.h" 
#include "Customer.h" 


int Customer::nextCustID = 9001; 

void Customer(){ 
    //nothing; 
} 

void Customer::Customer(int test, int tes2) 
{ 
    custID = 100; 
    firstName = "George"; 
    lastName = "sadfsad"; 
    numAccounts = 0; 
} 


void Customer::Customer(string fName, string lName) 
{ 
    custID = nextCustID++; 
    string firstName = fName; 
    string lastName = lName; 
    numAccounts = 0; 
} 

int  Customer::getCustID() { return custID; } 
string  Customer::getFirstName()  { return firstName;  } 
string  Customer::getLastName()  { return lastName;  } 
int  Customer::getNumAccounts() { return custID; } 

私は

Customer test("Billy", "Bob"); 

で顧客を初期化しようとしています。しかし、私は初期化しようとすると、私はエラーを取得します

BankControl.cc:(.text+0xaf): undefined reference to `Customer::Customer(std::string, std::string)' 
collect2: error: ld returned 1 exit status 

誰かが何らかの入力をしていると、私が間違っていることを理解できません。ありがとうございます。

Bankcontrol.cc

#include "BankControl.h" 
#include "Account.h" 
#include "Customer.h" 

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <sstream> 
#include "View.h" 

BankControl::BankControl() 
{ 
    Customer test("Joe", "Billy"); 
} 
+0

"defs.h"から何を使用していますか? –

+0

エラーメッセージはbankcontrol.ccにエラーが発生したと言います - このコードを質問に追加してください – EkcenierK

+0

*間違っていませんが、ヘッダーファイルで 'namespace std'を使用しないことをお勧めします。 –

答えて

1
void Customer::Customer(string fName, string lName) 
{ 
    custID = nextCustID++; 
    string firstName = fName; 
    string lastName = lName; 
    numAccounts = 0; 
} 

コンストラクタはvoid関数ではありません。したがって、 "空"を削除します。また、変数を代入するのではなく、初期化したいと思うかもしれません。

Customer::Customer(string fName, string lName) : firstName(fName), .... 

申し訳ありませんが、私はそれ以上のことはしませんでしたが、defs.hなしでは難しいです。お役に立てれば。

+0

def.hから何も使用されていないので完全に削除しました。 – user1730056

+0

C++ 11では、ヘッダーファイルにデフォルト値で変数を実際に初期化できることに注意してください。これにより、 '.cc'ファイルではなく、ヘッダに' int nextCustID = 9001; 'を設定することができます。 – Jvinniec

+0

ヘッダファイルに 'Customer();'と 'Customer(int test、int tes2);'を加え、 '.cc'ファイルのデフォルトのコンストラクタを' void Customer() 'から'顧客::顧客() '。 – Jvinniec

0

あなたが間違っていることを尋ねたので、ここで私が特定したいくつかの問題があります。

"defs.h"は不要です。
std::string<string>で定義されています)を除き、クラスCustomerは自己完結型に見えます。

ヘッダーに名前空間stdを使用する
良い考えではありません。つまり、std名前空間がこのヘッダーを含むすべてのソースファイルに含まれる(開かれた)ことを意味します。一定の基準による

パス定数変数
あなたの方法は非常に一定の基準によってそれらを渡し、その文字列パラメータを変更していません。

Customer(const std::string& fName, const std::string& lName) 

参照は、コンパイラが直接変数にアクセスするコードを生成することができますコピーを渡すのではなく。時には大きな変数のコピーを作成するには時間と余分なスペースが必要です。 nextCustId
ライン:識別子の欠落

int Customer::nextCustID = 9001; 

nextCustIDがクラスCustomerのメンバーであるが、データメンバーは、あなたが最初に掲載クラス宣言に存在しないことを言います。

コンストラクターには戻り値の型がありません。 コンストラクターの戻り値の型を指定しないでください。指定された戻り値の型を必要としない特別な関数です。

コンストラクタは、そのパラメータを使用していないパラメータ
コンストラクタ

Customer(int test, tes2) 

を使用していません。

+0

私はまた、 'Customer.h'が' Customer() 'と' Customer(int test、int test2) 'の宣言を欠いていることを指摘したいと思います。 – Jvinniec

0

1つのファイルBankcontrol.ccをコンパイルしてリンクしています。したがって、リンカーはファイルcustomer.ccで定義されているクラスCustomerのctorを見つけることができません。 IDEの設定やプロジェクトのすべてのソースファイルのコンパイルとリンクのためにシステムを構築し、すべてのファイルのコンパイルエラーを修正した後で動作する必要があります。

詳細はここで見つけることができます:

What is an undefined reference/unresolved external symbol error and how do I fix it?

How to link multiple implementation files in C

Thowさん最後のトピックCについて - C++のコンパイルとリンクの作業と同じように。

+0

customer.hとcustomer.ccの適切なリンクファイルは、依頼者はまだ同じ問題を抱えているつもりです。私は他の答えは実際の問題の印に近いと思う。 – Jvinniec

+0

あなたの疑問にもかかわらず、OP自身の答えの鉱山による@Jvinniecは最も近いものでした。 – Slava

+0

'void Customer :: Customer(string fName、string lName)'はコンストラクタを定義する有効な方法ではないためです。少なくともGCCはそれについて不平を言っているようだ。 – Jvinniec

-1

私のメイクファイルにCustomer.oを入れるのを忘れてしまった。それはすべてを解決しました。

+2

この回答と質問も他の人にとって価値がないので、あなたの質問を削除したいかもしれません。 – Slava

関連する問題