0

此代码中的 switch 语句不起作用。如果用户按 1,它应该将(全局)变量 x 定义为 A 类的实例,如果用户按 2,它应该定义为 B 类的实例。如果用户按 1,我想打印 A,如果她按 2,我想打印 B。我想使用“x.print()”语句,其中 x 是 A 类或 B 类,具体取决于输入。

#include <iostream>
using namespace std;

class A{
public:
    void print(){cout<<"A";}
};

class B{
public:
    void print(){cout<<"B";}
};

int main() {
    int choice;
    cout<<"Press 1 to print A\nPress 2 to print B\n";
    cin>>choice;

    //I know the following does not work, it's just to show what I want to do
    switch (choice){
    case 1: A x;
            break;
    case 2: B x;
            break;
    }

    x.print();
    return 0;
}
4

4 回答 4

1

您不会详细说明实际损坏的内容,但快速浏览一下您的代码,就会发现其中有很多问题:

  • 两个“x”对象都由 switch 语句限定,并且在代码执行到x.print().
  • 类 A 和 B 完全不相关,因此编译器将无法理解您所说的x.print();. 您必须确保这些类是相关的,要么从另一个派生一个,要么给两个类一个共同的祖先
  • 各种类中的打印函数不是虚拟的,因此无论如何您都无法获得多态行为
于 2013-08-03T16:22:06.963 回答
1

试试这个代码。它使用多态来得到你想要的:

#include <iostream>
using namespace std;

class Base {
public:
  virtual void print() = 0;
};

class A : public Base{
public:
    void print(){cout<<"A";}
};

class B : public Base{
public:
    void print(){cout<<"B";}
};

int main() {
    int choice;
    cout<<"Press 1 to print A\nPress 2 to print B\n";
    cin>>choice;

    Base *x = NULL;

    //I know the following does not work, it's just to show what I want to do
    switch (choice){
    case 1: x = new A();
            break;
    case 2: x = new B();
            break;
    }

    x->print();

    delete x;
    return 0;
}
于 2013-08-03T16:24:41.320 回答
1

看起来您正在尝试做的是根据条件创建类似的对象。为此,我建议继承。

class Base{
public:
        virtual void print()=0;
};

class A : public Base{
public:
        void print(){cout << "This is class A\n";}
}

所以主要看起来像:

Base* x = NULL;
switch (choice){
    case 1: x = new A();
            break;
    case 2: x = new B();
            break;
    }

这就是您似乎正在尝试做的事情。

于 2013-08-03T16:25:47.047 回答
1

您可以将答案修改为

#include <iostream>
using namespace std;
class super
{
public:
    virtual void print() = 0;
};
class A: public super{
public:
    void print(){cout<<"A";}
};

class B: public super{
public:
    void print(){cout<<"B";}
};

int main() {
    int choice;
    cout<<"Press 1 to print A\nPress 2 to print B\n";
    cin>>choice;

    super* x;
    switch (choice){
    case 1: x = new A() ;
            break;
    case 2: x = new B();
            break;
    }

    x->print();
    return 0;
}

在此,我们正在创建一个由 A 类和 B 类实现的接口。然后使用运行时多态性,我们正在创建所需类的对象。

于 2013-08-03T16:29:01.820 回答