C++11 具有相同超类实例数据的不同子类实例

C++11 具有相同超类实例数据的不同子类实例,c++11,inheritance,openmp,C++11,Inheritance,Openmp,我正在使用OpenMp,我需要复制一个类的实例N次(每个线程一次)。我正在使用继承来创建我的数据结构。例如: // Super class class vehicle { private: // general attributes of any vehicle ....... } // Sub class class car : public vehicle { private: // some specific attribu

我正在使用OpenMp,我需要复制一个类的实例N次(每个线程一次)。我正在使用继承来创建我的数据结构。例如:

// Super class
class vehicle {
    private:
        // general attributes of any vehicle
        .......
}

// Sub class
class car : public vehicle {
    private:
        // some specific attributes of a car
        string color;
        ......
    public:
        car(string color);
        car(car _car);
        void change_color(string color);
}
如果我有4个线程,我需要4个car实例,但我希望这4个实例共享超级类的相同特定数据(内存中只有一个副本)。例如,如果我有以下代码:

int main() {
    .....
    string colors[] = {"green", "blue", "red", "orange"};
    .....
    car base_car = new car(colors[0]); 
    car cars[4];
    for ( int i = 0; i < 4; i++ ) {
        cars[i] = new car(base_car);
    }
    ....
    int thread_id;
    #pragma omp parallel private (thread_id)
        thread_id = omp_get_thread_num();
        car thread_car = cars[thread_id];
        thread_car.change_color(colors[thread_id]);          
}
intmain(){
.....
字符串颜色[]={“绿色”、“蓝色”、“红色”、“橙色”};
.....
轿厢底座\轿厢=新车(颜色[0]);
汽车[4];
对于(int i=0;i<4;i++){
汽车[i]=新车(基本车);
}
....
int-thread_-id;
#pragma omp并行专用(线程id)
thread_id=omp_get_thread_num();
car thread_car=cars[thread_id];
线程车。更改颜色(颜色[线程id]);
}
我希望cars数组中的car实例共享超级类车辆的属性,也就是说,我希望只有一个超级类车辆属性的数据副本(内存中)和4个派生类车辆的数据副本

这是可能的吗


谢谢。

将对象状态(属性,在您的情况下)移动到一个单独的对象
car\u properties
。使用
共享\u ptr
(例如)在不同实例之间共享这些对象。你最好使它不可变。这是可能的,但不是你想象它的方式(“自动”通过继承)。您必须自己在
类car的构造函数和赋值运算符中创建并引用共享状态。除非你有充分的理由相信,在“生产级”应用程序中,仅仅给每辆车提供其自身的状态副本将是一个重大问题,否则我建议不要使用这种“共享状态”方案。对于“玩弄”汽车和车辆,这肯定会过于复杂和容易出错。是的,我有一个很好的理由这样做。我的记忆力有问题。我有一个对象,90%的数据是静态的,只有其他10%的数据被线程修改。到目前为止,我复制了对象N次(每个线程一次),但问题是当我在一个有16-32个线程的集群中执行Software时,因为对象使用了大量内存。例如,我有一个例子,对象使用了8%的内存,如果我使用16个线程,我有8*16=128%的内存,因此会终止进程。我曾想过这个解决方案,但我的想法是通过使用继承的一些技术来实现。。。好吧,如果不可能的话,我会用其他方法。非常感谢。Go fo“has_a”(合成)而不是“is_a”(继承)。创建另一个用于保存静态数据的类,并让包含动态数据的类保存静态数据类实例的共享ptr。并非所有的东西都必须或应该被当作继承来处理。使用两个独立的类和组合,可以使事情简单得多。将对象状态(在您的情况下是属性)移动到一个单独的对象
car\u properties
。使用
共享\u ptr
(例如)在不同实例之间共享这些对象。你最好使它不可变。这是可能的,但不是你想象它的方式(“自动”通过继承)。您必须自己在
类car的构造函数和赋值运算符中创建并引用共享状态。除非你有充分的理由相信,在“生产级”应用程序中,仅仅给每辆车提供其自身的状态副本将是一个重大问题,否则我建议不要使用这种“共享状态”方案。对于“玩弄”汽车和车辆,这肯定会过于复杂和容易出错。是的,我有一个很好的理由这样做。我的记忆力有问题。我有一个对象,90%的数据是静态的,只有其他10%的数据被线程修改。到目前为止,我复制了对象N次(每个线程一次),但问题是当我在一个有16-32个线程的集群中执行Software时,因为对象使用了大量内存。例如,我有一个例子,对象使用了8%的内存,如果我使用16个线程,我有8*16=128%的内存,因此会终止进程。我曾想过这个解决方案,但我的想法是通过使用继承的一些技术来实现。。。好吧,如果不可能的话,我会用其他方法。非常感谢。Go fo“has_a”(合成)而不是“is_a”(继承)。创建另一个用于保存静态数据的类,并让包含动态数据的类保存静态数据类实例的共享ptr。并非所有的东西都必须或应该被当作继承来处理。有了两个独立的类和组合,您可以使事情简单得多。