遇到一个很古怪的问题,C++类static const成员的初始化
在我的文件里有这class NFDuration, NFDuration.h里是这样的:
// A Duration represents the elapsed time between two instants
// as an int64 nanosecond count. The representation limits the
// largest representable duration to approximately 290 years.
class NFDuration
{
public:
static const int64_t kNanosecond; // = 1LL
static const int64_t kMicrosecond;// = 1000
static const int64_t kMillisecond;// = 1000 * kMicrosecond
static const int64_t kSecond; // = 1000 * kMillisecond
static const int64_t kMinute; // = 60 * kSecond
static const int64_t kHour; // = 60 * kMinute
public:
NFDuration();
explicit NFDuration(const struct timeval& t);
explicit NFDuration(int64_t nanoseconds);
explicit NFDuration(int nanoseconds);
explicit NFDuration(double seconds); // Nanoseconds returns the duration as an integer nanosecond count.
int64_t Nanoseconds() const; // These methods return double because the dominant
// use case is for printing a floating point number like 1.5s, and
// a truncation to integer would make them not useful in those cases. // Seconds returns the duration as a floating point number of seconds.
double Seconds() const; double Milliseconds() const;
double Microseconds() const;
double Minutes() const;
double Hours() const; struct timeval TimeVal() const;
void To(struct timeval* t) const; bool IsZero() const;
bool operator<(const NFDuration& rhs) const;
bool operator<=(const NFDuration& rhs) const;
bool operator>(const NFDuration& rhs) const;
bool operator>=(const NFDuration& rhs) const;
bool operator==(const NFDuration& rhs) const; NFDuration operator+=(const NFDuration& rhs);
NFDuration operator-=(const NFDuration& rhs);
NFDuration operator*=(int ns);
NFDuration operator/=(int ns); private:
int64_t ns_; // nanoseconds
}; #include "NFDuration.in.h"
在NFDuration.in.h里
#pragma once inline NFDuration::NFDuration()
: ns_()
{
} inline NFDuration::NFDuration(const struct timeval& t)
: ns_(t.tv_sec * kSecond + t.tv_usec * kMicrosecond)
{
} inline NFDuration::NFDuration(int64_t nanoseconds)
: ns_(nanoseconds)
{
} inline NFDuration::NFDuration(int nanoseconds)
: ns_(nanoseconds)
{
} inline NFDuration::NFDuration(double seconds)
: ns_((int64_t)(seconds * kSecond))
{
} inline int64_t NFDuration::Nanoseconds() const
{
return ns_;
} inline double NFDuration::Seconds() const
{
return double(ns_) / kSecond;
} inline double NFDuration::Milliseconds() const
{
return double(ns_) / kMillisecond;
} inline double NFDuration::Microseconds() const
{
return double(ns_) / kMicrosecond;
} inline double NFDuration::Minutes() const
{
return double(ns_) / kMinute;
} inline double NFDuration::Hours() const
{
return double(ns_) / kHour;
} inline bool NFDuration::IsZero() const
{
return ns_ == ;
} inline struct timeval NFDuration::TimeVal() const
{
struct timeval t;
To(&t);
return t;
} inline void NFDuration::To(struct timeval* t) const
{
t->tv_sec = (long)(ns_ / kSecond);
t->tv_usec = (long)(ns_ % kSecond) / (long)kMicrosecond;
} inline bool NFDuration::operator<(const NFDuration& rhs) const
{
return ns_ < rhs.ns_;
} inline bool NFDuration::operator<=(const NFDuration& rhs) const
{
return ns_ <= rhs.ns_;
} inline bool NFDuration::operator>(const NFDuration& rhs) const
{
return ns_ > rhs.ns_;
} inline bool NFDuration::operator>=(const NFDuration& rhs) const
{
return ns_ >= rhs.ns_;
} inline bool NFDuration::operator==(const NFDuration& rhs) const
{
return ns_ == rhs.ns_;
} inline NFDuration NFDuration::operator+=(const NFDuration& rhs)
{
ns_ += rhs.ns_;
return *this;
} inline NFDuration NFDuration::operator-=(const NFDuration& rhs)
{
ns_ -= rhs.ns_;
return *this;
} inline NFDuration NFDuration::operator*=(int n)
{
ns_ *= n;
return *this;
} inline NFDuration NFDuration::operator/=(int n)
{
ns_ /= n;
return *this;
}
在NFDuration.cpp里是这样初始化的:
#include "NFDuration.h" const int64_t NFDuration::kNanosecond = 1LL;
const int64_t NFDuration::kMicrosecond = * kNanosecond;
const int64_t NFDuration::kMillisecond = * kMicrosecond;
const int64_t NFDuration::kSecond = * kMillisecond;
const int64_t NFDuration::kMinute = * kSecond;
const int64_t NFDuration::kHour = * kMinute;
3个文件这样写,在windows,linux系统上使用后,编译都没有问题,但是我觉得NFDuration.in.h这个文件麻烦,就把NFDuration.in.h里的东西移到了NFDuration.h里
class NFDuration
{
public:
static const int64_t kNanosecond; // = 1LL
static const int64_t kMicrosecond;// = 1000
static const int64_t kMillisecond;// = 1000 * kMicrosecond
static const int64_t kSecond; // = 1000 * kMillisecond
static const int64_t kMinute; // = 60 * kSecond
static const int64_t kHour; // = 60 * kMinute
public:
NFDuration();
explicit NFDuration(const struct timeval& t);
explicit NFDuration(int64_t nanoseconds);
explicit NFDuration(int nanoseconds);
explicit NFDuration(double seconds); // Nanoseconds returns the duration as an integer nanosecond count.
int64_t Nanoseconds() const; // These methods return double because the dominant
// use case is for printing a floating point number like 1.5s, and
// a truncation to integer would make them not useful in those cases. // Seconds returns the duration as a floating point number of seconds.
double Seconds() const; double Milliseconds() const;
double Microseconds() const;
double Minutes() const;
double Hours() const; struct timeval TimeVal() const;
void To(struct timeval* t) const; bool IsZero() const;
bool operator<(const NFDuration& rhs) const;
bool operator<=(const NFDuration& rhs) const;
bool operator>(const NFDuration& rhs) const;
bool operator>=(const NFDuration& rhs) const;
bool operator==(const NFDuration& rhs) const; NFDuration operator+=(const NFDuration& rhs);
NFDuration operator-=(const NFDuration& rhs);
NFDuration operator*=(int ns);
NFDuration operator/=(int ns); private:
int64_t ns_; // nanoseconds
}; inline NFDuration::NFDuration()
: ns_()
{
} inline NFDuration::NFDuration(const struct timeval& t)
: ns_(t.tv_sec * kSecond + t.tv_usec * kMicrosecond)
{
} inline NFDuration::NFDuration(int64_t nanoseconds)
: ns_(nanoseconds)
{
} inline NFDuration::NFDuration(int nanoseconds)
: ns_(nanoseconds)
{
} inline NFDuration::NFDuration(double seconds)
: ns_((int64_t)(seconds * kSecond))
{
} inline int64_t NFDuration::Nanoseconds() const
{
return ns_;
} inline double NFDuration::Seconds() const
{
return double(ns_) / kSecond;
} inline double NFDuration::Milliseconds() const
{
return double(ns_) / kMillisecond;
} inline double NFDuration::Microseconds() const
{
return double(ns_) / kMicrosecond;
} inline double NFDuration::Minutes() const
{
return double(ns_) / kMinute;
} inline double NFDuration::Hours() const
{
return double(ns_) / kHour;
} inline bool NFDuration::IsZero() const
{
return ns_ == ;
} inline struct timeval NFDuration::TimeVal() const
{
struct timeval t;
To(&t);
return t;
} inline void NFDuration::To(struct timeval* t) const
{
t->tv_sec = (long)(ns_ / kSecond);
t->tv_usec = (long)(ns_ % kSecond) / (long)kMicrosecond;
} inline bool NFDuration::operator<(const NFDuration& rhs) const
{
return ns_ < rhs.ns_;
} inline bool NFDuration::operator<=(const NFDuration& rhs) const
{
return ns_ <= rhs.ns_;
} inline bool NFDuration::operator>(const NFDuration& rhs) const
{
return ns_ > rhs.ns_;
} inline bool NFDuration::operator>=(const NFDuration& rhs) const
{
return ns_ >= rhs.ns_;
} inline bool NFDuration::operator==(const NFDuration& rhs) const
{
return ns_ == rhs.ns_;
} inline NFDuration NFDuration::operator+=(const NFDuration& rhs)
{
ns_ += rhs.ns_;
return *this;
} inline NFDuration NFDuration::operator-=(const NFDuration& rhs)
{
ns_ -= rhs.ns_;
return *this;
} inline NFDuration NFDuration::operator*=(int n)
{
ns_ *= n;
return *this;
} inline NFDuration NFDuration::operator/=(int n)
{
ns_ /= n;
return *this;
}
这个时候在wondows上使用后编译时没有问题的, 但是在Linux上老是报static const成员没有定义的错误, 于是我把初始化写的类里面, 把NFDuration.cpp里的东西删掉, NFDuration.h变成了这样
class NFDuration
{
public:
static const int64_t kNanosecond = 1LL;
static const int64_t kMicrosecond = ;
static const int64_t kMillisecond = * kMicrosecond;
static const int64_t kSecond = * kMillisecond;
static const int64_t kMinute = * kSecond;
static const int64_t kHour = * kMinute;
.........................
其余与上面一样
然后就发现,在Linux上是没有问题了,但是在windows上又报static const成员没有定义, 这是咋回事啊,网上搜索也没有找到答案,最后只好又恢复成文字刚开始3个文件的样子, 貌似只有这样才没有问题,两个系统都能编译,只是原因想不通
找了很久终于找到原因了,娘的啊。。。。。。。。。。。。。。。。。。。。。。。。
终于找到原因了,所有的问题都找错了,不管怎么样写其实都没有问题, 真正的问题是timeval这个数据结构的,没法支持跨平台,而linux系统的编译器老是误报, 没有吧问题真正的原因暴露出来,timeval我也不知道怎么做到快平台,最后只好加上libevent的头文件,
解决了这个问题。 本来想删掉这文章的,想想留住纪念吧!!
遇到一个很古怪的问题,C++类static const成员的初始化的更多相关文章
- 类内const static(static const)成员变量初始化问题
在查找const相关资料的过程中,又遇到了另外一个问题,就是C++类中const static(或者static const)成员变量应当如何初始化的问题. 查阅了许多资料,发现VC环境下,只允许co ...
- 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能
编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...
- C++类的const成员函数、默认的构造函数、复制形参调用函数(转)
C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...
- 类的const成员
类的const成员包括const数据成员和const成员函数: 1.const数据成员: 和普通的const变量一样,定义时初始化,且不能修改 2.const成员函数: const成员函数只能访问其他 ...
- 【C++】类的特殊成员变量+初始化列表
参考资料: 1.黄邦勇帅 2.http://blog.163.com/sunshine_linting/blog/static/448933232011810101848652/ 3.http://w ...
- 初始化成员列表 ——— 类的const成员和引用成员的初始化
class A { public: A(){}; const int num; CString& s; } A::A() { cout<<A con<<endl; } ...
- 类的const成员函数,是如何改变const对象的?
我们知道类里面的const的成员函数一般是不允许改变类对象的,但是我们知道const 类型的指针是可以强制类型转出成非const指针的,同样的道理,this指针也可以被强制类型转换 class Y{ ...
- C++-类的const成员变量
当类中用到一些固定值时,希望将其定义为const成员变量,防止被修改. 但因为const成员变量因为初始化之后就不能修改,因此只能在构造函数的初始化列表中初始化 如果是数组,则没有办法在初始化列表中初 ...
- 类里面的非static const成员
类里面的成员变量可以用const修饰,在只用const不用static修饰的情况下,这种使用的限制比较多 (1)不能定义处初始化,必须在类的构造函数初始化列表里面初始化(虽然在vs中,可以在定义处初始 ...
随机推荐
- 【转载】uCOS系统的思考
一: 世界潮流,浩浩汤汤,顺之者昌,逆之者亡---孙中山 从80X86到ARM9,再从ARM9到ARM7,平台是越做越简单,但是简单并不是意味着退步,反而是种潮流趋势... 在CISC道路上渐行渐远 ...
- 精读JavaScript模式(七),命名空间模式,私有成员与静态成员
一.前言 惰性十足,这篇2月19号就开始写了,拖到了现在,就是不愿意花时间把看过的东西整理一下,其它的任何事都比写博客要有吸引力,我要反省自己. 从这篇开始,是关于JS对象创建模式的探讨,JS语言简单 ...
- LeetCode算法扫题系列83
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9104582.html LeetCode算法第83题(难度:简单) 题目:给定一个排序链表 ...
- #1 Python灵活技巧
前言 Python基础系列博文已顺利结束,从这一篇开始将进入探索更加高级的Python用法,Python进阶系列文章将包含面向对象.网络编程.GUI编程.线程和进程.连接数据库等.不过在进阶之前,先来 ...
- python模块之shutil
shutil是一个用于简化文件操作的模块. 复制文件(传入源文件对象和目标文件对象) import shutil f1 = open(r'/Users/jingxing/PycharmProjects ...
- SpringBoot解决ajax跨域问题
一.第一种方式: 1.编写一个支持跨域请求的 Configuration import org.springframework.context.annotation.Configuration; im ...
- 《c#图解教程》
书名 <c#图解教程> 图片 时间 2017-10-12月 学习 第20章的异步编程很好,在项目里面很有用.东西有点多时间久了不用就忘了
- C# Json反序列化
Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自行在nuget中导入 Jso ...
- python进程间通信
Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信. 1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个 ...
- oracle的Date类型遇到MyBatis产生的坑
坑描述: 公司的订单表数据量巨大(亿级),在进行查询的时候,发现一个慢查询. 背景: 数据库:oracle 表:T_order 索引字段:create_date (字段类型 date) 慢查询sql ...