将结构内存引用为数据类型

时间:2019-02-11 19:20:04

标签: c++ pointers

很抱歉,如果这个问题重复。


tl; dr:

How to :

struct t{ float[3] smthng = {9,1,2,3}; };
float a = (float*)&t; // to get an 9;

因此,我目前正在尝试通过将 python 概念转换为 C ++ 来节省内存空间。 这个想法是制作一个步进对象计时器(X = X0 + I*STEP),该计时器将在每次调用时增加自身并返回存储在其中的当前值。因此,当我需要使用频率公式进行波动时,我可以通过当前值计时器值。

我不能使用数组或列表,因为我需要操作的不仅仅是步进功能,例如在一定间隔后将其重置,添加定相和不同的起点等等。

因此,我已经构造了当前,步和结束浮点的结构,但是现在我需要能够在其上进行范围循环,并且只能引用当前属性(在这种情况下,步和结束是私有的。 / p>

计时器结构

struct timer{

private:
    void reset(){ // resets a current slot
        this->curr = 0.0f;
    }
    bool check(){ // checks if the next steps overflows the limit
        return (( this->curr+this->step) < this->end );
    }
public:
    float curr,step,end;
    timer(){
        this->curr = 0.0f;
        this->step = 1.0f;
        this->end = 10.0f;
    }
    template < class N, class T >
    timer( N step, T end ){
        this -> curr = 0.0f;
        this -> step = (float) step;
        this -> end  = (float) end;
    }

    template < class N >
    timer( N end ){
        this -> end = (float) end;
    }


};
std::ostream& operator<< (std::ostream &out, timer &data) {
    out<< "f(x) = "
            <<"I*" << data.step 
            << " [ "<< data.curr <<" / " << data.end << " ]"; 
    return out;
}

因此,在处理__begin__end方法之前,我要做的就是简单:

timer obj;
float a = &obj; // and to get an obj.current value

我尝试重载operator&operator*等。但是每次我尝试读取 timer struct 的内存时,我得到的只是转换错误。

那么有谁知道如何将结构内存作为特定类型引用?

2 个答案:

答案 0 :(得分:3)

您可以定义一个转换运算符:

struct timer{
    // ...
    operator float() const {
        return curr;
    }

这使类可以隐式转换:

float a = obj;

从技术上讲,&obj的确切语法是可以实现的,但是单进制operator&的重载是可怕的设计。

答案 1 :(得分:1)

尽管the answeer by @eerorika提供了一个出色的工作解决方案,但我认为最好使用更直接的方法来获取当前时间,而不要依赖强制转换运算符。

struct timer
{
    // ...
    float getCurrentTime() const
    {
        return curr;
    }
}

Timer timer;
float cur = timer.getCurrentTime();

更具可读性
Timer timer;
float cur = timer;