错误C2509:未在派生类

时间:2016-12-28 23:45:00

标签: c++ compiler-errors

我有基类状态和派生类 InitialState 。当我构建解决方案编译器时显示错误C2509:' setView':成员函数没有在初始状态' 中声明,我也不知道为什么...... 这是 State.h:

#ifndef STATE_H
#define STATE_H
#include<iostream>
using namespace std;

class State {
public:
    State() { isPrototype = true; }
    virtual void execute() = 0;
    virtual void setView(ostream& screen) const = 0;
    virtual void onEnter() { system("CLS"); setView(cout); }
    virtual void onExit() = 0;

private:
    bool isPrototype;
    State* nextState;
};


#endif

InitialState.h:

#ifndef INITIAL_STATE_H
#define INITIAL_STATE_H

#include"State.h"

class InitialState : public State {
public:
    void execute() {}
    void onExit() {}
    void setView(ostream& screen) const;
};

#endif

InitialState.cpp:

#include"InitialState.h"

void InitialState::setView(ostream& screen) const {
    screen << "Welcome!" << endl;
    screen << "Please select what you want to do: " << endl << "1.Load card" << endl << "0.Exit" << endl;
}

我试图添加关键词&#34;虚拟&#34;在InitialState.h中的函数前面,但它没有改变任何东西......当我删除I​​nitialState.cpp时,代码也会正常编译。

这是 AtmTest.cpp:

#include "PaymentCard.h"
//#include "Atm.h"

int main() {
    return 0;
}

但它与国家没有任何关系...... 这是其他类: 的 Atm.h:

#ifndef ATM_H
#define ATM_H
#include<iostream>

using namespace std;

class Atm {
public:
    static Atm* get();
    static void release() { delete instance; instance = nullptr; }  //Singleton
private:
    int serialNumber;
    string bankName;
    string location;

    //Singleton:
    Atm();
    static Atm* instance;
    Atm(const Atm& m) = delete;
    Atm& operator=(const Atm& m) = delete;
    Atm(Atm&&) = delete;
    Atm& operator=(Atm&& m) = delete;

};

#endif

Atm.cpp:

#include"Atm.h"

//Singleton:
Atm* Atm::instance = nullptr;


Atm* Atm::get() {
    if (instance == nullptr) {
        instance = new Atm();
    }
    return instance;
}

PaymentCard.h:

#ifndef PAYMENT_CARD_H
#define PAYMENT_CARD_H
#include<iostream>
using namespace std;

class PaymentCard {
public:
    PaymentCard(string clientName);
    void addMoney(unsigned int amount) { currentAmount += amount; }
    void withdrawMoney(int amount);
    friend ostream& operator<< (ostream&, const PaymentCard&);
private:
    static int NumberGenerator;     
    unsigned int serialNumber;      
    string clientName;
    int currentAmount;
};


#endif

PaymentCard.cpp:

#include"PaymentCard.h"

int PaymentCard::NumberGenerator = 0;

PaymentCard::PaymentCard(string clientName) {
    currentAmount = 0;
    this->clientName = clientName;
    serialNumber = NumberGenerator++;
}

void PaymentCard::withdrawMoney(int amount) {
    if (amount > currentAmount)cout << "Ovde ide izuzetak";
    else currentAmount -= amount;
}

ostream& operator<< (ostream &os, const PaymentCard& card){
    os << card.serialNumber + 1 << ". Client: " << card.clientName << endl;
    return os;
}

这段代码还没有接近完成,但是直到我在InitialState中创建了SetView,所以idk发生了什么......

1 个答案:

答案 0 :(得分:0)

问题:InitialState.h是预编译的,您链接到InitialState.h的早期版本。完全清理,重建和/或禁用预编译的标头。

我怀疑,因为:

  1. 我可以通过在InitialState.h中注释掉setView()的声明来重现错误。
  2. 生成的错误消息引用InitialState.cpp的第3行,并且您发布的错误消息引用第6行,这表示发布的源代码未生成该错误消息。
  3. 要重现错误,必须注释掉InitialState类中的setView()decalration:

    1>InitialState.cpp(3): error C2509: 'setView' : member function not declared in 'InitialState'
    1>          c:\users\laci\desktop\samples\stackoverflow\InitialState.h(6) : see declaration of 'InitialState'
    

    然后会收到以下错误消息:

    String a = "a\nb"