C++ 使用C+;中的公共函数返回类指针+;

C++ 使用C+;中的公共函数返回类指针+;,c++,pointers,return,C++,Pointers,Return,我试图使用一个以字符串为参数的公共函数返回类指针。我不知道是怎么做的(正确的方法)。这就是我所拥有的: Room::Room* getPointer(const string &nameOfRoom){ return &Room(); } 如果使用此构造,是返回正确的指针,还是返回指向函数正在创建的新实例的指针? 多谢各位 对不起,大家没有很清楚我的意图。我有一个房间,里面有指向其他房间的指针列表。在我看来,这应该看起来像一个图表(希望是一个)。我有一个

我试图使用一个以字符串为参数的公共函数返回类指针。我不知道是怎么做的(正确的方法)。这就是我所拥有的:

Room::Room* getPointer(const string &nameOfRoom){    
    return &Room();  
}  
如果使用此构造,是返回正确的指针,还是返回指向函数正在创建的新实例的指针?
多谢各位

对不起,大家没有很清楚我的意图。我有一个房间,里面有指向其他房间的指针列表。在我看来,这应该看起来像一个图表(希望是一个)。我有一个字符,它通过使用列表中的指针来“导航”图形。我以字符串的形式获取用户的输入。如果我的用户说“移动到卧室”,我希望将“卧室”作为参数传递给函数,以便我能够以某种方式获得指向列表中卧室的指针。
我不确定我的解释是否正确,所以请原谅我的“新手”和之前没有解释。

谢谢

不,那绝对是错的。大多数编译器都应该警告您这一点。我一点也不确定函数的预期语义是什么,因为您对它还不是很清楚,但这绝对不是它。

不,这绝对是错误的。大多数编译器都应该警告您这一点。我一点也不确定函数的预期语义是什么,因为您对它不是很清楚,但这绝对不是它。

如果您的意思是试图返回指向对象的指针,那么您可以这样做

Room* getP(const std::string& sfasd)
{
    return this;
}
但是,从语义上讲,这样做更好:

Room& getP(const std::string& sfasd)
{
    return *this;
}
此外,您还可以随时执行以下操作:

Room r;
Room *rp=&r;
最后,如果你想创建一个新房间,你可以这样做

Room& getP(const std::string& name)
{
    return new Room(name);
}

::://else where
std::unique_ptr<Room> room_pointer(getP("hi"));
Room&getP(const std::string&name)
{
返回新房间(名称);
}
://否则在哪里
标准:唯一的ptr房间指针(getP(“hi”);

如果您的意思是试图返回指向对象的指针,则可以这样做

Room* getP(const std::string& sfasd)
{
    return this;
}
但是,从语义上讲,这样做更好:

Room& getP(const std::string& sfasd)
{
    return *this;
}
此外,您还可以随时执行以下操作:

Room r;
Room *rp=&r;
最后,如果你想创建一个新房间,你可以这样做

Room& getP(const std::string& name)
{
    return new Room(name);
}

::://else where
std::unique_ptr<Room> room_pointer(getP("hi"));
Room&getP(const std::string&name)
{
返回新房间(名称);
}
://否则在哪里
标准:唯一的ptr房间指针(getP(“hi”);

不清楚您想做什么。 但首先,函数返回的是基于堆栈的变量的地址,这是错误的,因为一旦函数返回,指针将无效

顺便说一下,传递字符串而不使用它是在浪费堆栈空间。。。。如果您使用的是microsoft编译器,则可以启用级别4警告(默认情况下不启用),并且它将发出有关该级别的警告

如果要创建房间的新实例,只需执行以下操作:

Room* Room::getPointer()
{
   return new Room();
}

再说一遍,我不确定你想要什么,所以我只能在这一点上猜测

不清楚你想做什么。 但首先,函数返回的是基于堆栈的变量的地址,这是错误的,因为一旦函数返回,指针将无效

顺便说一下,传递字符串而不使用它是在浪费堆栈空间。。。。如果您使用的是microsoft编译器,则可以启用级别4警告(默认情况下不启用),并且它将发出有关该级别的警告

如果要创建房间的新实例,只需执行以下操作:

Room* Room::getPointer()
{
   return new Room();
}


再说一遍,我不确定你想要什么,所以我只能在这一点上猜测

你想做什么还不清楚。您希望返回的指针指向什么?@OliCharlesworth,意图不清楚,但代码显然是错误的。@DavidRodríguez dribeas的继续:当然。但在我们知道意图之前很难给出答案…@OliCharlesworth:很抱歉从一开始就不清楚。我已经用“适当”的解释修改了我的文本。不清楚你想做什么。您希望返回的指针指向什么?@OliCharlesworth,意图不清楚,但代码显然是错误的。@DavidRodríguez dribeas的继续:当然。但在我们知道意图之前很难给出答案…@OliCharlesworth:很抱歉从一开始就不清楚。我已经用一个“适当”的解释修改了我的文本。你说我在浪费堆栈空间:我应该如何定义我的函数,这样我就不会这样做了?谢谢。@Adrian:这不仅仅是浪费堆栈空间,可能是个bug。为什么不使用
nameOfRoom
呢?你说我在浪费堆栈空间:我应该如何定义我的函数,这样我就不会这样做了?谢谢。@Adrian:这不仅仅是浪费堆栈空间,可能是个bug。为什么不使用
nameOfRoom
呢?很抱歉,我的编译器警告我,
Error:“this”只能在您提供的前两个解决方案的非静态成员函数中使用。谢谢,是的;这些显然应该是写在类主体内的成员函数。你对这门语言学了多少?@KarlKnechtel:我的方法是在课外写的,因为我的讲师说我们应该在课外写。解释是,如果您的类很长,编译器将变得混乱,人们应该期待有有线问题。感谢您为我指出这一点。这是典型的,当给出代码示例来编写成员函数时,就好像它们是内联的,假设它们所处的类的上下文足够明显。编译器不会被长的类主体“弄糊涂”,但将它们移出肯定有很多很好的组织理由。@Adrian:编译器不会弄糊涂,但你会。解决方案:在类内部声明方法(“有一个名为
getP
)的函数),在类外部定义它(“这是class
Room
getP
”函数)。如果这样做,编译器就会知道
getP
属于一个类,并且有一个
这个
类指针。对不起