Home > Enterprise >  Accessing Member Variables of Derived Structs Without Casting
Accessing Member Variables of Derived Structs Without Casting

Time:02-05

I have a bunch of derived structs. Is there any way for me to access the derived width without casting?

If I do this, I get 1s and not 42 and 13:

#include <iostream>
#include <deque>
using namespace std;

struct BaseParams {
    virtual ~BaseParams() {}
    int width = 1;
};

struct VectorParams : BaseParams {
    int width = 42;
};

struct MatrixParams : BaseParams {
    int width = 13;
};

int main()
{

    std::deque<BaseParams *> params;
    VectorParams *vectorParams = new VectorParams;
    MatrixParams *matrixParams = new MatrixParams;
    
    params.push_back(vectorParams);
    params.push_back(matrixParams);
    
    for (auto &param : params) {
        std::cout << param->width << std::endl;
    }
    
    // Don't want to do this
    // for (auto &param : params) {
    //     MatrixParams *matrixParams = dynamic_cast<MatrixParams *>(param);
    //     if (matrixParams)
    //         std::cout << matrixParams->width << std::endl; 
    //     VectorParams *vectorParams = dynamic_cast<VectorParams *>(param);
    //     if (vectorParams)
    //         std::cout << vectorParams->width << std::endl;
    // }
    
    return 0;
}

If possible, I want to avoid casting because I have so many derived structs.

CodePudding user response:

To overwrite the width in BaseParams, instead of making a new variable, you can give VectorParams a constructor like this:

struct MatrixParams : BaseParams {
    VectorParams() {
        width = 42;
    }
};

In fact constructors are always how variables are set in new objects. When you write

struct BaseParams {
    virtual ~BaseParams() {}
    int width = 1;
};

the compiler actually turns it into a constructor, similar to

struct BaseParams {
    virtual ~BaseParams() {}
    int width;
    BaseParams() {
        width = 1;
    }
};
  •  Tags:  
  • c
  • Related