-4

我正在尝试将对象发送到另一个班级,尽管我遇到了问题。

错误:在构造函数 StartGame::StartGame(EntitySystem&) 中:

错误:类 StartGame 没有任何名为 ES 的字段

主文件

#include <iostream>
#include "EntitySystem.h"
#include "StartGame.h"

using namespace std;

int main()
{
    EntitySystem ES;
    StartGame SG(ES);
    SG.Start();
    return 0;
}

开始游戏.h

#ifndef STARTGAME_H
#define STARTGAME_H
#include "EntitySystem.h"
#include <iostream>

using namespace std;
class StartGame
{
public:
    StartGame(EntitySystem&);
    void ClassSelection();
    void Start();
    virtual ~StartGame();
};

开始游戏.cpp

#include "StartGame.h"
#include "EntitySystem.h"
#include "windows.h"
#include "stdlib.h" // srand, rand
#include <iostream>
#include <ctime> //time

using namespace std;

StartGame::StartGame(EntitySystem& ES) : ES(ES)
{
}

我做了一些谷歌搜索,但无法弄清楚。
提前致谢。

4

2 回答 2

2

因为在您的构造函数的成员初始化列表中,您正在尝试初始化一个名为 的成员ES,该成员不存在......

您可以通过在类的声明中执行此操作来修复它:

class StartGame
{
    public:
        StartGame(EntitySystem&);
        void ClassSelection();
        void Start();
        virtual ~StartGame();
    protected:
    private:
        EntitySystem ES;
    //  ^^^^^^^^^^^^^^^^
};

// in the .cpp
StartGame::StartGame(EntitySystem& ES)
    : ES(ES)
//    ^^ Now this member exists
{
}

但我建议您重命名参数或成员,因为两者的名称相同可能会令人困惑......

于 2013-08-11T17:35:25.227 回答
0

您的代码执行此操作:

StartGame::StartGame(EntitySystem& ES)
    : ES(ES)

让我们分解一下:

":"       <-  means "Memberwise initialization"
"ES("     <-  means "call the constructor for member 'ES'"
"(ES)"    <-  these are the arguments to pass to the constructor
"{ ... }" <-  here is the constructor body itself.

问题是,您的班级没有名为“ES”的成员。

但你还有一个次要问题。

"ES(ES)"

如果你有一个名为“ES”的成员变量,这里就会发生冲突。

您可能希望采用几种广泛使用的做法来避免将来出现此类问题。

  1. 对类、结构、类型定义使用大写字母(“SomeClass”)。
  2. 对非局部变量使用前缀:“m_”代表成员,“s_”代表静态,“g_”代表全局,(有些人还使用“u_”代表联合,“um_”代表联合成员等)。
  3. 对函数参数使用“_”后缀,例如void myFunction(int arg1_, int arg2_) { ...
  4. 对函数使用大写字母,并为“getter”和“setter”函数选择命名约定。

例如

static size_t s_counter = 0; // count of how many things we've done.
extern size_t g_nowServing;  // imported from another module.

class Customer {
    size_t m_ticketNo;       // which ticket number I pulled
    std::string m_licensePlate;
public:
    Customer(size_t ticketNo_, const char* licensePlate_)
        : m_ticketNo(ticketNo_)
        , m_licensePlate("")
    {
        // somewhat artificial implementation for demonstrative purposes.
        char licensePlate[8] = "\0\0\0\0\0\0\0";
        for (size_t i = 0; i < sizeof(licensePlate); ++i) {
            if (!isalnum(licensePlate_[i]))
                throw CustomerException("invalid character in license plate");
            licensePlate[i] = licensePlate_[i];
        }
        if (licensePlate[sizeof(licensePlate) - 1] != '\0')
            throw CustomerException("invalid license plate -- too long");

        m_licensePlate = licensePlate;
    }
};

这使得立即诊断代码中的问题变得更加容易:

StartGame::StartGame(EntitySystem& es_)
    : m_es(es_)
{
}

这会产生编译器错误error: class StartGame does not have any field named m_es和宾果游戏 - 您将能够立即解决问题。

于 2013-08-11T18:13:08.543 回答