这是一个简化的例子来说明这个问题:
class A {};
class B
{
B(A& a) : a(a) {}
A& a;
};
class C
{
C() : b(a) {}
A a;
B b;
};
Run Code Online (Sandbox Code Playgroud)
因此B负责更新C的一部分.我通过lint运行代码并且它围绕引用成员发出错误:lint#1725.这谈到了对默认副本和分配的关注,这是公平的,但默认的副本和赋值也很糟糕,所以那里没有什么优势.
我总是尽量使用引用,因为裸指针不确定地引入了谁负责删除指针.我更喜欢按值嵌入对象,但如果我需要一个指针,我在拥有指针的类的成员数据中使用auto_ptr,并将对象作为引用传递.
当指针可能为null或可能更改时,我通常只在成员数据中使用指针.有没有其他理由更喜欢指向数据成员的引用?
是否真的可以说包含引用的对象不应该是可赋值的,因为初始化后不应更改引用?
int fn();
void whatever()
{
(void) fn();
}
Run Code Online (Sandbox Code Playgroud)
是否有任何理由将未使用的返回值转换为无效,或者我是否认为这完全是浪费时间?
跟进:
那看起来相当全面.我认为这比评论未使用的返回值更好,因为自我记录代码比评论更好.就个人而言,我会关掉这些警告,因为这是不必要的噪音.
如果一个虫子逃脱,我会吃掉我的话......
我正在寻找一种方法将一些数据填充到DLL边界的字符串中.因为我们使用不同的编译器,所有的dll接口都是简单的char*.
是否有正确的方法将指针传递给dll函数,以便它能够直接填充字符串缓冲区?
string stringToFillIn(100, '\0');
FunctionInDLL( stringToFillIn.c_str(), stringToFillIn.size() ); // definitely WRONG!
FunctionInDLL( const_cast<char*>(stringToFillIn.data()), stringToFillIn.size() ); // WRONG?
FunctionInDLL( &stringToFillIn[0], stringToFillIn.size() ); // WRONG?
stringToFillIn.resize( strlen( stringToFillIn.c_str() ) );
Run Code Online (Sandbox Code Playgroud)
看起来最有希望的是&stringToFillIn [0]但是这是一个正确的方法,假设你认为string :: data()==&string [0]?这似乎不一致.
或者最好是吞下额外的分配并避免问题:
vector<char> vectorToFillIn(100);
FunctionInDLL( &vectorToFillIn[0], vectorToFillIn.size() );
string dllGaveUs( &vectorToFillIn[0] );
Run Code Online (Sandbox Code Playgroud) 我的第一篇文章所以请你放轻松!
我知道C++中的结构和类之间没有真正的区别,但包括我在内的很多人使用结构或类来显示意图 - 用于分组"普通旧数据"的结构和用于具有有意义操作的封装数据的类.
现在,这很好但是你在什么时候开始认为某些东西不仅仅是一个结构而且应该成为一个类?
我认为结构有合理的事情:
我不太确定的事情,但可能会这样做:
我不认为结构应该有:
边界在哪里?
另外,将类实例作为结构的成员是否合理?例如
class C {private: int hiddenData; public: void DoSomething();};
struct S {int a; float b; C c; };
S s; s.c.DoSomething();
Run Code Online (Sandbox Code Playgroud)
记住,我不是关于你可以用C++做什么,我对你在设计好的软件时应该做些什么感兴趣.
思考?
将"this"传递给以下代码中初始化列表中的另一个对象时是否有任何问题?
class Callback { public: virtual void DoCallback() = 0; };
class B
{
Callback& cb;
public:
B(Callback& callback) : cb(callback) {}
void StartThread();
static void Thread()
{
while (!Shutdown())
{
WaitForSomething();
cb.DoCallback();
}
}
};
class A : public Callback
{
B b;
public:
A() : b(*this) {b.StartThread();}
void DoCallback() {}
};
Run Code Online (Sandbox Code Playgroud)
如果这样做是不安全的,那么最好的替代方案是什么?
我正在使用WMI Win32_NetworkAdapterConfiguration类EnableDHCP方法在网络适配器上启用DHCP服务.我正在使用XP Embedded SP2,但它也发生在我的桌面上(XP SP3).
除非拔下网线,否则一切都很顺利.
如果电缆断开连接,EnableDHCP将返回94(未找到路径,文件或对象),当我查看网络控制面板属性时,它将设置为手动配置,地址为0.0.0.0,掩码为255.0.0.0.
奇怪的是,当处于这种状态时,EnableStatic第一次失败,代码为94或81(无法配置DHCP服务),但第二次运行.
即使拔掉电缆,使用netsh或Windows GUI启用DHCP也能正常工作.
有谁知道如何解决这个问题?
如果我想在流上输出4位数的固定宽度十六进制数,我需要做这样的事情:
cout << "0x" << hex << setw(4) << setfill('0') << 0xABC;
Run Code Online (Sandbox Code Playgroud)
这似乎有点长啰嗦.使用宏有助于:
#define HEX(n) "0x" << hex << setw(n) << setfill('0')
cout << HEX(4) << 0xABC;
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来组合操纵器?
我想编写一个函数,需要在DC上设置剪切区域,但在完成时恢复DC上的任何现有剪切区域.
所以我发现GetClipRgn哪些听起来就像我想要的那样,但似乎令人困惑.我找不到任何使用它的例子,Petzold没有提供任何东西.
我想出的是:
void DrawStuff( HDC hDC )
{
HRGN restoreRegion = CreateRectRgn( 0, 0, 0, 0 );
if (GetClipRgn( hDC, restoreRegion ) != 1)
{
DeleteObject( restoreRegion );
restoreRegion = NULL;
}
//
// Set new region, do drawing
//
SelectClipRgn( hDC, restoreRegion );
if (restoreRegion != NULL)
{
DeleteObject( restoreRegion );
}
}
Run Code Online (Sandbox Code Playgroud)
我需要创建一个区域才能获得当前区域,这似乎很奇怪.
这是正确的用法吗?
是否有更好的方法来达到同样的效果?
我正在使用astyle,这对于将标准样式应用于现有代码非常有用.但是我注意到它遇到这个时:
ostringstream myStream;
myStream << 1
<< 2;
Run Code Online (Sandbox Code Playgroud)
它重新格式化为:
ostringstream myStream;
myStream << 1
<< 2;
Run Code Online (Sandbox Code Playgroud)
这是我的选项文件:(版本1.23)
Run Code Online (Sandbox Code Playgroud)--indent=spaces --brackets=break --indent-switches --indent-namespaces --min-conditional-indent=4 --break-closing-brackets --pad-paren-in --unpad-paren --convert-tabs
有没有办法让它排在下一行的"<<"上?
编辑:
我还尝试使用以下文件(test.cpp)的1.22版:
void main()
{
ostringstream myStream;
myStream << 1
<< 2;
}
Run Code Online (Sandbox Code Playgroud)
使用以下选项(format.txt):
--indent=spaces
--brackets=break-closing
--indent-switches
--indent-namespaces
--min-conditional-indent=4
--pad=paren-in
--unpad=paren
--convert-tabs
Run Code Online (Sandbox Code Playgroud)
和以下命令行:
astyle --options = format.txt test.cpp
产生了这个:
void main()
{
ostringstream myStream;
myStream << 1
<< 2;
}
Run Code Online (Sandbox Code Playgroud) 我一直在和其他人的代码一起工作,并注意到在ostringsteam的所有用途中,他们都习惯于明确追加std::ends.
这是我从未做过的事情,从未遇到过问题.
它似乎没有,但应该std::ends在以下代码中有任何区别?
ostringstream message;
message << "Hello world, version " << 2 /* << std::ends ??? */;
printf( "%s\n", message.str().c_str() );
Run Code Online (Sandbox Code Playgroud)