我有一张基本卡属性的基类卡。 主要是由于CallingCard类和IDCard类都继承了基类Card,所以出现了重定义错误。 我尝试过使用标题保护,但我不能正确地实现它们。 同样在main中,当使用g++编译器时,我需要包含“。cpp”而不是“。h”,因为包含“。h”会给我一个错误
体系结构X86_64的未定义符号:
_main-ad117f.o(int,std::__1::Basic_String,std::__1::Allocator>,std::__1::Basic_String,std::__1::Allocator>,int,std::__1::Basic_String,std::__1::Allocator>,int)“,引用自:
_MAIN-AD117F.O中的MAIN
ld:找不到体系结构x86_64的符号
CLANG:错误:链接器命令失败,退出代码为%1(使用-V查看调用)
它不可能是标题保护,也可能是在main中包含“。cpp”而不是“。h”,但这给了我一个我不知道如何修复的错误。请帮助我修复任何问题,无论是标题保护还是包含“。cpp”而不是“。h”。
CARD.H
这是我的基类
#include<iostream>
#include<string.h>
using namespace std;
#ifndef CARD_H //Header guards or pragma once? and how to implement?
#define CARD_H
class Card
{
private:
int cardNumber;
protected:
string ownerName;
public:
string expiryDate;
Card(int cardNumber=0, string ownerName="Non", string expiryDate="0");
void display();
};
#endif
card.cpp
#include"Card.h"
Card::Card(int cardNumber, string ownerName, string expiryDate)
{
this->cardNumber=cardNumber;
this->ownerName=ownerName;
this->expiryDate=expiryDate;
}
void Card::display()
{
cout<<"Card Number: "<<this->cardNumber<<endl;
cout<<"Owner Name: "<<this->ownerName<<endl;
cout<<"Expiry Date: "<<this->expiryDate<<endl;
}
callingcard.h
这是从基类继承的子类
#include"Card.cpp"
#ifndef CALLINGCARD_H
#define CALLINGCARD_H
class CallingCard :
public Card
{
private:
int amount;
string companyName;
int PIN;
public:
CallingCard(int cardNumber, string ownerName, string expiryDate, int amount=0, string companyName="Non", int PIN=0);
void display();
};
#endif
CallingCard.cpp
#include"CallingCard.h"
CallingCard::CallingCard(int cardNumber, string ownerName, string expiryDate, int amount, string companyName, int PIN):Card(cardNumber,ownerName,expiryDate)
{
this->amount=amount;
this->companyName=companyName;
this->PIN=PIN;
}
void CallingCard::display()
{
Card::display();
cout<<"Amount: "<<this->amount<<endl;
cout<<"Company Name: "<<this->companyName<<endl;
cout<<"PIN: "<<this->PIN<<endl;
}
IDCARd.h
这是从基类继承的另一个子类
#include"Card.cpp"
#ifndef IDCARD_H
#define IDCARD_H
class IDCard :
protected Card
{
private:
int CNICNumber;
int age;
public:
IDCard(int cardNumber, string ownerName, string expiryDate, int CNICNumber=0, int age=0);
string getExpiryDate() const;
void display();
};
#endif
idcard.cpp
#include"IDCard.h"
IDCard::IDCard(int cardNumber, string ownerName, string expiryDate, int CNICNumber, int age):Card(cardNumber,ownerName,expiryDate)
{
this->CNICNumber=CNICNumber;
this->age=age;
}
void IDCard::display()
{
Card::display();
cout<<"CNIC Number: "<<this->CNICNumber<<endl;
cout<<"Age: "<<this->age<<endl;
}
main.cpp
#include"CallingCard.cpp"
#include"IDCard.cpp"
int main()
{
CallingCard card(1234, "Sana", "10-2-2018", 1000, "Warid", 444);
card.display();
IDCard idCard(1234, "Sana", "10-2-2018", 35202, 29);
idCard.display();
}
head-guards必须保护整个文件,因此它们必须是第一件也是最后一件事:
// Nothing before the guard
#ifndef NAME_OF_HEADER
#define NAME_OF_HEADER
// All the stuff
#endif
// Nothing after the guard
或者只是
// Nothing before the guard
#pragma once
// All the stuff
它不是标准的一部分,但得到大多数编译器的支持。
其次,不要包含.cpp
-文件。 仅包括标头。