【问题标题】:Cannot instantiate class inside other class. Member Map::value is not a type name无法在其他类中实例化类。 Member Map::value 不是类型名称
【发布时间】:2021-12-01 03:15:36
【问题描述】:
сlass Chunk
{
private:
    size_t value;
public:
    Chunk(size_t value)
    {
        this->value;
    }
};

class Snake
{
private:
    size_t value;
    std::vector<Chunk> snake_body;
public:
    Snake(size_t value) 
    {
        Chunk head_chunk(value);
        snake_body.push_back(head_chunk);
    }
};

class Map
{
private:
    size_t value;
                            // Not able to find "snake" definiton
    Snake snake(value);     // member Map::value is not a type name
    Snake snake { value; }  // Why it works?
}

我是 OOP 的新手,试图通过创建游戏控制台蛇来学习它。这是我遇到的一个问题。游戏的结构应该是地图类拥有一条蛇。但是当我试图实例化它时,我遇到了一个问题。花了这么多时间在 SOF 上,但还没有找到任何东西。以及为什么它适用于 {} 请帮助;/

【问题讨论】:

标签: c++ oop constructor member typename


【解决方案1】:

Snake snake(value) 不是有效的初始化语法,Snake snake{ value } 是有效的语法(但可能初始化为一个未初始化的值,因为 value 未初始化)。下面的代码中还有一些 cmets:

class Map
{
public:
    // this is best if you want the main program to initialize snake with a user provided value
    explicit Map(size_t value) :
        snake{ value }              // aggregate initialization https://en.cppreference.com/w/cpp/language/aggregate_initialization
    {
    }

private:
    size_t value;           // if you use Snake{value} then also initialize value here, size_t value{0}; (or size_t value = 0;)
    // Not able to find "snake" definiton
    Snake snake(value);    //  <== this tries to make a call to the constuctor of Snake which can't be done here
    Snake snake{ value; }  // <== this is a valid initialization syntax, but uses unitialized value (so result can be any number)
}

【讨论】:

  • 值得一提的是,在构造函数的初始化列表中,括号是有效的语法:Map(...) : snake(value) {}——尤其是在模板编程中,这种语法是更可取的,因为如果有一个带有初始化列表的统一初始化语法可能会选择错误的构造函数还有一个参数兼容!
  • @Aconcagua 确实,值得仔细检查何时使用 {} 和何时使用 ()。感谢您的提醒
  • @PepijnKramer 为什么在'Snake snake(value)'行中的构造函数不能在那里完成?并且可以使用 Snake snake{ value;如果还有另一个名为 Game 的类,它会将值传递给 Map 构造函数,然后将这个值传递给蛇?
  • 我没有制定规则,它们就是这样:en.cppreference.com/w/cpp/language/…。方式2)。是的,如果你有多个 Map 实例,那么在 Map 的构造函数中传递值并将其传递给蛇构造函数是要走的路
猜你喜欢
  • 2013-07-05
  • 2011-08-14
  • 2021-09-25
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多