小编mar*_*h44的帖子

我应该更喜欢会员数据中的指针或引用吗?

这是一个简化的例子来说明这个问题:

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或可能更改时,我通常只在成员数据中使用指针.有没有其他理由更喜欢指向数据成员的引用?

是否真的可以说包含引用的对象不应该是可赋值的,因为初始化后不应更改引用?

c++ reference class-members

126
推荐指数
6
解决办法
9万
查看次数

为什么将未使用的返回值转换为void?

int fn();

void whatever()
{
    (void) fn();
}
Run Code Online (Sandbox Code Playgroud)

是否有任何理由将未使用的返回值转换为无效,或者我是否认为这完全是浪费时间?

跟进:

那看起来相当全面.我认为这比评论未使用的返回值更好,因为自我记录代码比评论更好.就个人而言,我会关掉这些警告,因为这是不必要的噪音.

如果一个虫子逃脱,我会吃掉我的话......

c c++ void

105
推荐指数
7
解决办法
4万
查看次数

直接写入std :: string内部缓冲区

我正在寻找一种方法将一些数据填充到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++ string

34
推荐指数
4
解决办法
3万
查看次数

C++结构的"可接受"功能是多少?

我的第一篇文章所以请你放轻松!

我知道C++中的结构和类之间没有真正的区别,但包括我在内的很多人使用结构或类来显示意图 - 用于分组"普通旧数据"的结构和用于具有有意义操作的封装数据的类.

现在,这很好但是你在什么时候开始认为某些东西不仅仅是一个结构而且应该成为一个类?

我认为结构有合理的事情:

  1. 构造函数只有简单的初始化代码.
  2. 序列化代码,例如流插入/提取运算符.

我不太确定的事情,但可能会这样做:

  1. 比较运算符
  2. 简单的转换函数 - 例如,在从外部源接收数据后,以字节为单位等待所有成员.

我不认为结构应该有:

  1. 动态内存分配.
  2. 析构函数.
  3. 复杂的成员函数.

边界在哪里?

另外,将类实例作为结构的成员是否合理?例如

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++做什么,我对你在设计好的软件时应该做些什么感兴趣.

思考?

c++ oop struct

16
推荐指数
3
解决办法
1350
查看次数

从构造函数初始化列表中传递此函数

将"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)

如果这样做是不安全的,那么最好的替代方案是什么?

c++

10
推荐指数
2
解决办法
5333
查看次数

断开连接的适配器上的WMI EnableDHCP失败

我正在使用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也能正常工作.

有谁知道如何解决这个问题?

windows wmi networking

10
推荐指数
1
解决办法
2183
查看次数

是否有一种结合流操纵器的好方法?

如果我想在流上输出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)

是否有更好的方法来组合操纵器?

c++ iomanip

7
推荐指数
1
解决办法
1382
查看次数

正确使用GetClipRgn?

我想编写一个函数,需要在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)

我需要创建一个区域才能获得当前区域,这似乎很奇怪.

这是正确的用法吗?

是否有更好的方法来达到同样的效果?

c++ winapi

7
推荐指数
1
解决办法
3618
查看次数

astyle格式化多行<<

我正在使用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)

--indent=spaces
--brackets=break
--indent-switches
--indent-namespaces
--min-conditional-indent=4
--break-closing-brackets
--pad-paren-in
--unpad-paren
--convert-tabs
Run Code Online (Sandbox Code Playgroud)

有没有办法让它排在下一行的"<<"上?

编辑:

我还尝试使用以下文件(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)

c++ coding-style

6
推荐指数
1
解决办法
5865
查看次数

ostringstream和结束

我一直在和其他人的代码一起工作,并注意到在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)

c++ string stream

2
推荐指数
1
解决办法
3833
查看次数

标签 统计

c++ ×9

string ×2

c ×1

class-members ×1

coding-style ×1

iomanip ×1

networking ×1

oop ×1

reference ×1

stream ×1

struct ×1

void ×1

winapi ×1

windows ×1

wmi ×1