提问者:小点点

因此,我正在为我的学校作业练习继承,但我不能正确地实现报头卫士


我有一张基本卡属性的基类卡。 主要是由于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();



}

共1个答案

匿名用户

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-文件。 仅包括标头。