在c ++初始化对象时遇到问题 - Linux

时间:2016-09-29 20:46:45

标签: c++ linux class object g++

不确定我做错了什么,希望有人能指出我正确的方向。我创建了一个客户类但我无法对其进行初始化。

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");
}

4 个答案:

答案 0 :(得分:1)

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

构造函数不是void函数。所以,删除&#34; void&#34;。此外,您可能希望初始化变量而不是分配变量。

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

抱歉,我没有做更多,但没有defs.h,这很难。希望这会有所帮助。

答案 1 :(得分:0)

既然你问你做错了什么,这里有一些我已经确定的问题。

<强>&#34;的defs.h&#34;不需要。
除了由Customer定义的std::string之外,班级<string>看起来是自包含的。

在标题中使用命名空间std
不是个好主意。这意味着将为包含此标头的每个源文件包含(打开)std命名空间。

通过常量引用传递常量变量
你的方法没有修改它们的字符串参数,所以通过常量引用传递它们:

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

该引用将允许编译器生成直接访问变量的代码,而不是传递副本。有时制作大型变量的副本需要时间和额外的空间。

缺少标识符:nextCustId
这一行:

int Customer::nextCustID = 9001;

表示nextCustID是类Customer的成员,但数据成员不存在于您最初发布的类声明中。

构造函数没有返回类型 不要指定构造函数的返回类型,它们是不需要指定返回类型的特殊函数。

构造函数不使用参数
构造函数

Customer(int test, tes2)

不使用其参数。

答案 2 :(得分:0)

您正在编译和链接一个文件Bankcontrol.cc。因此,链接器无法找到文件Customer中定义的类customer.cc的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

关于C-C ++编译和链接的最后一个主题以相同的方式工作。

答案 3 :(得分:-1)

忘记将Customer.o放入我的makefile中。这解决了一切。