【问题标题】:Invoking method in C++ [closed]在 C++ 中调用方法 [关闭]
【发布时间】:2011-12-29 03:12:01
【问题描述】:

关于 C++ 编程的问题。

你能在 C++ 中做这样的事情吗:

Lecture le;
Carriage ca = le;

没有演员表,就这样写。问题是,当我尝试调用属于 Lecture 类的方法时,这些方法用红色下划线标记。

ca.runIt();

我不太确定我是否理解了我的任务规范,但是给出了这个 sn-p 的代码。最好的问候

【问题讨论】:

  • 这个问题非常模糊。首先,LectureCarriage 类型的定义是什么?
  • 你能“做这样的事”吗?是的。它做你认为它做的事吗?可能不会。
  • 您能否更详细地描述“我的任务规范”?也许我们不了解您的问题的某些方面。

标签: c++ methods variable-assignment


【解决方案1】:

让我们分解一下,从一般情况到最具体的情况。

如果你有一些任意类 A 和一些其他任意类 B,则声明:

A a;
B b = a;

一般不会起作用。它肯定不会自己工作;你必须努力让它发挥作用。

所以现在,让我们具体一点。如果B 是从A 派生的类,那么它不起作用。如果A 派生自B,它仍然不起作用。

为什么?因为A a 定义了一个对象,而不是一个引用。它创造了一个价值。 B b = a; 尝试将值 a 存储到新值 b 中。你不能那样做。

如果A 派生自BB 是基类),您可以这样做:

A a;
B &b = a;

那是合法的 C++,也很有意义。 b 现在指的是a部分。具体来说,a 的基类部分。

请注意,反向不起作用。如果A 是基类,C++ 会引发错误。

现在,有一种方法可以使一般性陈述发挥作用。

A a;
B b = a;

如果您希望这对于一个特定B是合理的,那么B必须定义如下:

class B ... //Whatever base classes you want.
{
public:
  B(const A &a);
};

采用const A & 的构造函数是转换构造函数。它的工作是使用来自a 对象的数据创建一个B 对象。因为这个转换构造函数声明没有explicit关键字,那么它可以用于隐式转换像B b = a;如果它被声明explicit关键字,你必须明确地转换它:B b = B(a);

在类上具有转换构造函数意味着A 的任何实例都可以转换为B。因此,您可以将A 传递给采用B(通过值或通过const&不是通过引用)的函数,而无需进行显式转换。

请注意,构造对象的转换允许您在对象B 上调用来自A 的函数。您只能在 B 上调用由 B 定义或由 B 的基类之一定义的函数。

【讨论】:

  • 谢谢大家这么多的回答。我刚刚发现源文件的内容有错误。应该有一个 Lecture 类,而不是 Carriage。顺便说一下,这个程序中没有使用继承。
【解决方案2】:

你能用 C++ 做这样的事情吗:

是的。

struct Lecture {
};
struct Carriage {
  Carriage(const Lecture&) {
  }
  void runIt() {
  }
};

int main() {
  Lecture le;
  Carriage ca = le;
  ca.runIt();
}

问题是,当我尝试调用属于 Lecture 类的方法时,这些方法用红色下划线标出。

当然。 ca 不是 LecturecaCarriage。您只能在 ca 上调用 Carriage 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多