【问题标题】:Return the class pointer by using a public function in C++在 C++ 中使用公共函数返回类指针
【发布时间】:2012-03-31 12:18:27
【问题描述】:

我正在尝试使用一个将字符串作为参数的公共函数来返回类指针。我不确定它是如何完成的(正确的方法)。这就是我所拥有的:

Room::Room* getPointer(const string &nameOfRoom){    
    return &Room();  
}  

如果我使用这个构造,我是返回正确的指针还是指向我的函数正在创建的新实例的指针?
谢谢你

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

【问题讨论】:

  • 不清楚你想做什么。你希望返回的指针指向什么?
  • @OliCharlesworth,意图不清楚,但代码显然是错误的......
  • @DavidRodríguez-dribeas:当然。但是在我们知道意图是什么之前很难提供答案......
  • @OliCharlesworth:很抱歉从一开始就不清楚。我已经用“正确”的解释修改了我的文字。

标签: c++ pointers return


【解决方案1】:

如果你的意思是你试图将指针返回到一个对象,那么你可以这样做。

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"));

【讨论】:

  • 很抱歉,我的编译器警告我 Error: 'this' may only be used inside a nonstatic member function 对于您提供的前 2 个解决方案。谢谢
  • 嗯,是的;这些显然应该是成员函数,写在类体内。你对这门语言学了多少?
  • @KarlKnechtel:我的方法是在课堂之外编写的,因为我的讲师说我们应该在课堂之外编写它们。解释是,如果您的类很长,编译器会感到困惑,并且应该会遇到连线问题。感谢您为我指出。
  • 在给出代码示例来编写成员函数时,就好像它们是内联的一样,这是典型的,假设它们进入哪个类的上下文足够明显。编译器不会被长类主体“弄糊涂”,但肯定有很多很好的组织理由将它们移出。
  • @Adrian:编译器不会混淆,但你会。解决方案:在类内声明方法(“有一个名为getP的函数),在类外定义它(”这是函数@987654327 @ of class Room ")。如果这样做,编译器就知道 getP 属于一个类,并且有一个 this 类指针。
【解决方案2】:

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

【讨论】:

  • 很抱歉一开始就不清楚。我已经用“正确”的解释修改了我的文字。
【解决方案3】:

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

顺便说一句,你通过传递一个字符串而不使用它来浪费堆栈空间......如果你使用的是微软编译器,你可以打开第 4 级警告(默认情况下不打开),它会发出一个警告。

如果您想创建 Room 的新实例,只需执行以下操作:

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

再说一次,我不确定你想要什么,所以我现在只能猜测。

【讨论】:

  • 你说我在浪费堆栈空间:我应该如何定义我的函数,而不是这样做?谢谢。
  • @Adrian:这不仅仅是浪费堆栈空间,它可能是一个错误。为什么不使用nameOfRoom
猜你喜欢
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2020-12-24
相关资源
最近更新 更多