在C ++类中初始化静态结构

时间:2014-07-03 10:04:02

标签: c++ struct initialization

我想初始化静态struct std_msgs :: ColorRGBA。 不幸的是它没有构造函数来初始化它的4个float成员,因为它不是我自己的类,所以我无法修改它的构造函数。

class A {
static std_msgs::ColorRGBA white; // struct with 4 float members;
};

如何初始化静态成员白色?我不能使用c ++ 11

我试过

std_msgs::ColorRGBA A::white  = { 1.0f, 1.0f,  1.0f, 1.0f};

结构看起来像:

template <class T>
struct ColorRGBA_ {
  typedef ColorRGBA_<T> Type;

  ColorRGBA_(): r(0.0), g(0.0), b(0.0), a(0.0)  { }
  ColorRGBA_(const ContainerAllocator& _alloc) : r(0.0), g(0.0) , b(0.0), a(0.0)  {  }

   typedef float _r_type;
  _r_type r;
   typedef float _g_type;
  _g_type g;
   typedef float _b_type;
  _b_type b;
   typedef float _a_type;
  _a_type a;

  typedef boost::shared_ptr< ::std_msgs::ColorRGBA_<ContainerAllocator> > Ptr;
  typedef boost::shared_ptr< ::std_msgs::ColorRGBA_<ContainerAllocator> const> ConstPtr;
  boost::shared_ptr<std::map<std::string, std::string> > __connection_header;

};

最好的问候

3 个答案:

答案 0 :(得分:1)

您可以执行初始化功能(例如,ColorRGBA_init),如下例所示:

#include <iostream>

namespace std_msgs {
  struct ColorRGBA {
    double r;
    double g;
    double b;
    double a;
  };    
}

std_msgs::ColorRGBA ColorRGBA_init(double const r = 1.0, double const g = 1.0, const double b = 1.0, double const a = 1.0) {
  std_msgs::ColorRGBA out;
  out.r = r;
  out.g = g;
  out.b = b;
  out.a = a;
  return out;
}

class A {
public:
static std_msgs::ColorRGBA white; // struct with 4 float members;
};

std_msgs::ColorRGBA A::white = ColorRGBA_init();

int main() {
    std::cout << A::white.r << std::endl;
}

答案 1 :(得分:1)

为该类型编写任何init函数,例如:

std_msgs::ColorRGBA GenerateColorRGBA() {
    std_msgs::ColorRGBA color;
    color.r = 1.0f;
    color.g = 1.0f;
    color.b = 1.0f;
    color.a = 1.0f;
    return color;
}

std_msgs::ColorRGBA A::white = GenerateColorRGBA();

答案 2 :(得分:1)

不知道为什么该结构被模板化或需要像那样声明,因为它不是 aggregate 而你不能初始化列表初始化它,您应该使用初始化函数或方法,如下所示

#include <iostream>
using namespace std;

namespace std_msgs {

  template <class T>
  struct ColorRGBA_ {
    typedef ColorRGBA_<T> Type;

    ColorRGBA_(): r(0.0), g(0.0), b(0.0), a(0.0)  { }
    //ColorRGBA_(const ContainerAllocator& _alloc) : r(0.0), g(0.0) , b(0.0), a(0.0)  {  }

    typedef float _r_type;
    _r_type r;
    typedef float _g_type;
    _g_type g;
    typedef float _b_type;
    _b_type b;
    typedef float _a_type;
    _a_type a;

    /*typedef boost::shared_ptr< ::std_msgs::ColorRGBA_<ContainerAllocator> > Ptr;
    typedef boost::shared_ptr< ::std_msgs::ColorRGBA_<ContainerAllocator> const> ConstPtr;
    boost::shared_ptr<std::map<std::string, std::string> > __connection_header;*/

  };

  typedef ColorRGBA_<float> ColorRGBA;

}

class A {
public:
  static std_msgs::ColorRGBA white; // struct with 4 float members;
};

// std_msgs::ColorRGBA A::white = {1.0f,1.0f,1.0f,1.0f}; // Just works for aggregates


std_msgs::ColorRGBA initializeMe() {
  std_msgs::ColorRGBA obj;
  obj.r = 22.0f;
  // ..
  return obj;
}

std_msgs::ColorRGBA A::white = initializeMe();

int main()
{
  cout << A::white.r;
}

http://ideone.com/7LOlOe

相关问题