0

クラス A にメンバー "int B" と "int C" があるとします。このクラスのオブジェクトを作成するとき、「int B」のみを含むか「int C」のみを含むか (または両方を含む場合) を選択したいと考えています。

(別の方法として、B と C を std::vectors として宣言し、サイズを 1 に変更する方法があることはわかっていますが、これは、それらを使用するたびに [0] を追加する必要があることを意味します。 std::vector は、何かを割り当てるかどうかにかかわらず、デフォルトで 20B を使用するように見えるため、メンバーごとに 20 バイトを無駄にする必要があります。)

4

2 に答える 2

3

継承を使用します。いくつかの仮想メソッドも必要になる場合があります。

class Settlement
{
   public:
      virtual void updateMarketCount()=0;//pure virtual function
};

class Town : public Settlement
{
    public:
       virtual void updateMarketCount();
    private:
       int m_markets;
       int m_industries;
};

class Village : public Settlement
{
     public:
       virtual void updateMarketCount();
     private:
       int m_markets;
};

このようにして、これらすべてのオブジェクトを一般的な決済ポインターに割り当てることができます。例えば:

 std::shared_ptr<Settlement> mysettlementPtr(new Town());//C++ 11 only. Found in memory header
 Settlement* mysettlementPtr = new Town();//C++ < 11

ベクトルを実行する方法は次のとおりです。

std::vector<std::shared_ptr<Settlement>> mySettlements;
mySettlements.push_back(std::shared_ptr<Town>(new Town()));
mySettlements.push_back(std::shared_ptr<Village>(new Village()));

これは非常に単純な作業例です。

決済.h:

#pragma once
class Settlement
{
    public:
        virtual void increaseMarkets()=0;
        virtual int getMarketCount()=0;
};

Town.h

#pragma once
#include "Settlement.h"
class Town : public Settlement
{
    public:
        Town():m_markets(0){}
        virtual void increaseMarkets(){++m_markets;}
        virtual int getMarketCount(){return m_markets;}
    private:
       int m_markets;
       int m_industries;
};

村.h

#pragma once
#include "Settlement.h"

class Village : public Settlement
{
    public:
        virtual void increaseMarkets(){++m_markets;}
        virtual int getMarketCount(){return m_markets;}
     private:
       int m_markets;
};

シンプルな例.cpp:

#include<iostream>
#include<memory>
#include "Settlement.h"
#include "Village.h"
#include "Town.h"

int main()
{
    std::shared_ptr<Settlement> mysettlement(new Town());
    std::cout << "I HAVE: " << mysettlement->getMarketCount() << " MARKETS" <<  std::endl;
    mysettlement->increaseMarkets();
    std::cout << "NOW I HAVE " << mysettlement->getMarketCount() << " MARKETS" << std::endl;
    std::cout << "PRESS ENTER TO CONTINUE." << std::endl;
    system("pause");
    return 0;
}

注:ヘッダーに関連する .cpp ファイルに関数を抽出することをお勧めします。

于 2013-06-14T19:58:32.837 に答える