2015-11-04 19 views
0

我已经考虑过一个对象'genObj'。这个对象可以是类电话,笔记本电脑,鞋子或书本。 我希望用户输入从1-4变化,并相应地将genObj分配给一个特定的类。根据用户输入在C++中为特定对象分配不同的类

我希望这样做,因为我必须将这些对象添加到数据文件。我为不同的类维护了4个单独的数据文件,并且也相应地为fileName赋值。

switch(mode) 
    { 
    case 1: 
     phones genObj; 
     strcpy(fileName,"phonesDatabase.dat"); 
     break; 
    case 2: 
     computers genObj; 
     strcpy(fileName,"computersDatabase.dat"); 
     break; 
    case 3: 
     shoes genObj; 
     strcpy(fileName,"shoesDatabase.dat)"; 
     break; 
    case 4: 
     books genObj; 
     strcpy(fileName,"booksDatabase.dat"); 
     break; 
    } 

这样做,hovewer,提供了以下错误:

"Multiple declaration for genObj in function add(int)" 

值被指定给文件没有问题,因为我已经声明

char fileName[20]; 

全球,连带后来初始化。但是,由于对象genObj可以是不同的类,所以不能像这样初始化。

如果我不能根据用户输入分配genObj不同的类,我将不得不将代码分成4个部分,每个部分为一个类。那太麻烦了,太不雅了。

谢谢。

+0

如果您使用C++编写(基于您的标签),请使用C++!从你的词汇表中删除'strcpy'。 –

+0

您正在寻找的设计模式称为工厂。请Google。 –

回答

1

您不能在运行时动态决定对象的类型。

好像你应该在这种情况下使用多态性

首先定义一个抽象类,说object,它定义了用于访问您的genObj行为。也就是说,phonescomputersshoesbooks的所有内容都有共同之处。

然后使object这四个子类,然后是这样的:

std::unique_ptr<object> genObj; 

switch(mode) 
{ 
    case 1: 
     genObj = std::make_unique<phones>(); 
     strcpy(fileName, "phonesDatabase.dat"); 
     break; 
    case 2: 
     genObj = std::make_unique<computers>(); 
     strcpy(fileName, "computersDatabase.dat"); 
     break; 
    case 3: 
     genObj = std::make_unique<shoes>(); 
     strcpy(fileName, "shoesDatabase.dat)"; 
     break; 
    case 4: 
     genObj = std::make_unique<books>(); 
     strcpy(fileName, "booksDatabase.dat"); 
     break; 
} 

(注意make_unique是一个功能仅在最近的C++标准,因此,如果您在编写代码旧的标准,那么你将不得不使用new代替,如genObj.reset(new books)。)

另外,作为一个侧面说明,使mode枚举类型的,这样你就不必处理幻数,可替代1234分别具有一些描述性名称,例如mode::phones,mode::computersmode::shoesmode::books

+0

你应该补充说这只会在C++ 14中工作(因为'make_unique <>')。而且既然你在这里,他可能会使用枚举类而不是枚举。 – Blito

+0

@Blito增加了一个关于这个的笔记。并且范围枚举枚举也不是?我并没有否定范围枚举的选项,实际上我甚至用'mode ::'前缀暗示了它。 – emlai

+0

是的,他们是。不同之处在于,通过仅使用枚举,他也可以使用普通整数而不是'mode :: phones'等。'mode ::'前缀也可以在(旧)枚举中使用,因此它是不明确的。这只是一个细节。 – Blito

0

switch构建不会为您处理对象的动态分配。在这里使用具有通用界面或抽象类(取决于您的需要)的织物会更好,如类IFace,然后使用局部变量IFace *genObj,然后使其等于new some_derived_from_IFace

相关问题