【问题标题】:Passing values to a Constructor which takes pointers parameter [closed]将值传递给带有指针参数的构造函数
【发布时间】:2022-11-02 21:58:31
【问题描述】:

我对 C++ 很陌生,我正在尝试在一个名为 Room 的类中初始化一个名为 GameObject 的对象,该类包含一个 gameObjects array,其中包含两个 GameObject GameObject 类的构造函数采用 @987654328 @ 作为参数来初始化字段。但是我不断收到错误消息,说“没有匹配的构造函数用于初始化GameObject。有人可以告诉我这里的错误是什么吗?

抱歉,如果这个问题的格式不正确,我不习惯用多个头文件和源文件来问 C++ 问题。但也请就此纠正我。

GameObject C++ 源文件:

#include "GameObject.h"
#include "wordwrap.h"

using std::string;

GameObject::GameObject(string* _name, string* _description, char* _keyWord):
name(_name), description(_description), keyWord(_keyWord){

}

Room C++ 源文件:

#include "Room.h"
#include "wordwrap.h"

Room::Room(const string* _name, const string *_desc) :
        name(_name), description(_desc), north(nullptr) {

//error!, "No matching constructor for initialization..."
    gameObjects[0] = new GameObject("knife", "a knife", 'k'); 
    gameObjects[1] = new GameObject("sword", "a sword", 's'); 

};

【问题讨论】:

  • 为什么std::string*s 而不是std::strings?
  • (a) 请阅读How to Askminimal reproducible example,因为类声明有助于回答问题。 (b) string* 参数不寻常,我希望 string const & 或只是 string(对于接收器参数)。

标签: c++ pointers constructor


【解决方案1】:

好吧,你在 GameObject 构造函数中:

GameObject::GameObject(string* _name, string* _description, char* _keyWord):
name(_name), description(_description), keyWord(_keyWord){}

您通过指针接受两个字符串和一个字符。因此,也许您打算通过引用来接受它们,而不是像这样:

GameObject::GameObject(string _name, string _description, char _keyWord):
name(_name), description(_description), keyWord(_keyWord){}

哪个工作正常。

以这个程序为例:

#include<iostream>
#include<string>

struct my_obj
{
    my_obj(std::string s, std::string s_, char c)
    : s__(s), s___(s_), char_(c) {}

    std::string s__{};
    std::string s___{};
    char char_{};
};

struct my_obj_2
{
    my_obj(std::string* s, std::string* s_, char* c)
    : s__(s), s___(s_), char_(c) {}

    std::string s__{};
    std::string s___{};
    char char_{};
};

int main()
{
    my_obj my_obj_1("Hello", "Goodbye", 'C'); // works fine

    my_obj_2 m_my_obj_2("Hello", "Goodbye", 'c'); // doesn't work fine
}

(1):这很好用,因为它找到了一个匹配的构造函数:

标准::字符串 -> 标准::字符串

(2):虽然这不能正常工作,因为它是这种转换:

标准::字符串->标准::字符串*

所以总而言之,只需删除构造函数上的指针,如果你愿意,你可以通过 &amp;const &amp; 像这样传递

GameObject::GameObject(string& _name, string& _description, char _keyWord):
name(_name), description(_description), keyWord(_keyWord){}

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 2022-01-21
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2023-03-22
    • 2016-11-07
    相关资源
    最近更新 更多