2011-11-15 69 views
-5

关于C++编程的问题。在C++中调用方法

可以使用C++做这样的事情:

Lecture le; 
Carriage ca = le; 

没有铸造,只是写这样。问题是,当我试图调用属于Lecture类的方法时,方法以红色下划线。

ca.runIt(); 

我不太清楚,如果我了解我的任务规范,但给出了这段代码。最好的问候

+7

这个问题令人难以置信的含糊。首先,“Lecture”和“Carriage”类型的定义是什么? – ildjarn

+7

你可以“做这样的事情”吗?是。它做你认为它做的事吗?可能不会。 –

+0

你能否更详细地描述“我的任务规范”?也许你的问题有些方面我们并不了解。 –

回答

3

你可以在C++做这样的事情:

是。

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

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

的问题是,当我试图调用属于讲座类红色下划线的方法的方法。

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

1

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

如果你有一些任意A类和一些其他的任意类B,语句:

A a; 
B b = a; 

一般行不通的。它会肯定不能自行工作;你必须付出努力使其工作。

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

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

如果AB导出(B是基类),你可以此:

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的基类之一定义。

+0

非常感谢你的答复。我刚刚发现源文件的内容有错误。应该有一个讲座班,而不是Carriage。顺便说一下,这个程序中没有使用继承。 – ucas