C ++,“星际游戏”没有任何名为“es”的字段

时间:2013-08-11 17:33:29

标签: c++

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

  

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

     

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

Main.cpp

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

using namespace std;

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

StartGame.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();
};

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)
{
}

我做了一些谷歌搜索,无法想象 提前谢谢。

2 个答案:

答案 0 :(得分:2)

因为在构造函数的 member-initialization-list 中,您正在尝试初始化一个名为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
{
}

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

答案 1 :(得分: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. 对类,结构,类型定义使用upper-camelcase(“SomeClass”)。
  2. 为非局部变量使用前缀:“m_”代表成员,“s_”代表静态,“g_”代表全局,(有些人也使用“u_”代表工会,“um_”代表工会成员等)。
  3. 对函数参数使用'_'后缀,例如void myFunction(int arg1_, int arg2_) { ...
  4. 对函数使用大写,并为“getter”和“setter”函数选择约定约定。
  5. e.g。

    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和宾果游戏 - 你本可以立即回答这个问题。