2013-08-03 27 views
0

此代碼中的switch語句不起作用。它應該定義(全局)變量x,如果用戶按下1,則爲類A的實例,如果用戶按下2,則將變量x定義爲類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; 
} 
+0

你不能在switch語句中聲明x。它完成時超出範圍,x變得未定義。 – Amadeus

+0

是的,我知道。它只是爲了展示我想要做的事情。 – Slazer

+0

您需要說超過「此代碼已損壞」。請說明你看到了什麼錯誤。另外,如果你已經知道你的例子是錯誤的,因爲'x'超出了範圍,那麼你需要展示一個沒有這個問題的更好的例子。 – lurker

回答

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; 
} 
1

你不打算到細節,以什麼是真正打破,但在從你的代碼看一眼,就在那裏一堆問題:

  • 兩個「X」對象由switch語句作用域,並且在代碼執行到x.print()時不存在。
  • A和B類完全不相關,因此編譯器將無法確定x.print();的含義。你必須確保這些類是相關的,或者通過從另一個派生出來或者通過給這兩個類共同的祖先
  • 各類中的打印功能不是虛擬的,因此無論如何你都不能獲得多態行爲
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; 
    } 

這就是好像你正在嘗試做的。

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類和實現,那麼使用運行時多態性,我們正在創造所需的類的對象的接口,你可以修改你的答案。