小编Sma*_*ash的帖子

"if"条件下的变量赋值

我最近失去了一些时间来弄清楚我的代码中的错误是由一个错字引起的:

if(a=b)
Run Code Online (Sandbox Code Playgroud)

代替:

if(a==b)
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何特殊情况你想要在if语句中为变量赋值,或者如果没有,为什么编译器不会发出警告或错误?

c++ if-statement

29
推荐指数
7
解决办法
6万
查看次数

平滑的颜色过渡算法

我正在寻找一种通用算法来平滑地在两种颜色之间转换.

例如,此图像来自维基百科,显示从橙色到蓝色的过渡.

在此输入图像描述

当我尝试使用我的代码(C++)做同样的事情时,想到的第一个想法是使用HSV颜色空间,但是令人讨厌的中间颜色显示.

在此输入图像描述

实现这一目标的好方法是什么?似乎与对比度的减少有关,或者可能使用不同的色彩空间?

c++ colors

12
推荐指数
4
解决办法
1万
查看次数

MFC CView(CFormView)破坏崩溃

根据这个stackoverflow问题:

以编程方式退出MFC应用程序的正确方法是什么?

我在用 AfxGetMainWnd()->PostMessage(WM_CLOSE,0,0);退出MFC程序.(SDI,CFrameWnd包含带有两个CFormViews的CSplitterWnd)

正如预期的那样DestroyWindow().

我面临的问题是在导出的CFormView销毁之后,根据MSDN:

在非自动清理对象上调用DestroyWindow后,C++对象仍然存在,但m_hWnd将为NULL.[ MSDN ]

现在,CView析构函数被调用,然后它就完成了

CDocument::RemoveView()...
CDocument::UpdateFrameCounts()
Run Code Online (Sandbox Code Playgroud)

它在以下断言上失败: ASSERT(::IsWindow(pView->m_hWnd));

我查了一下 m_hWnd之前调用的派生CView析构函数中已经设置为NULL.

我究竟做错了什么 ?

编辑:

这是一个图表,说明我想发送WM_CLOSE消息而不是WM_QUIT的原因.

在此输入图像描述

我认为这个答案在MSDN技术说明有所体现, but I can't figure it out.

编辑2:

事物被调用的顺序:

1- AfxGetMainWnd()->PostMessage(WM_CLOSE,0,0);

2- Derived CFrameWnd::OnClose()

3- CFrameWnd::OnClose()

哪个叫 CWinApp::CloseAllDocuments(BOOL bEndSession);

哪个叫 CDocManager::CloseAllDocuments(BOOL bEndSession)

哪个叫 CDocTemplate::CloseAllDocuments(BOOL)

哪个叫 CDocument::OnCloseDocument()

现在,在这个功能

while (!m_viewList.IsEmpty())
{
    // get frame attached to the view
    CView* pView = (CView*)m_viewList.GetHead();
    ASSERT_VALID(pView);
    CFrameWnd* pFrame = pView->EnsureParentFrame();

    // and close it …
Run Code Online (Sandbox Code Playgroud)

c++ mfc destructor

11
推荐指数
1
解决办法
1441
查看次数

VS2010:从dll加载符号非常慢

我有一个程序,我正在我的戴尔笔记本电脑XPS 502X上工作.在工作中,我通常有另一台显示器插入我的DVI端口,一切都很好.当我在家工作时,我只有笔记本电脑屏幕.当我在VS2010中启动程序时,它非常慢,我注意到屏幕底部Loading symbols for ...\NVIDIA Corporation\coprocmanager\detourel.dll...每次大约需要10-20秒.对于为什么会发生这种情况的任何想法?

编辑:

我认为这是一个司机问题,但现在又发生了.

我尝试了在类似问题中发布的想法

-DeleteAllBreakpoints东西,没用.

- 无需远程符号获取或网络路径

- 启用我的代码

看起来像是由图形驱动程序注入的钩子DLL ...让我发疯!

编辑2:

问题发生了,今天一切似乎都发现了,昨天,我甚至注意到当我启动CFileDialog时程序运行时加载GROOVEEX.dll很慢.所以它可能不仅仅是与图形驱动程序相关的东西.

dll symbols visual-studio-2010

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

C++和QT中的MVC和Subject-Observer模式

免责声明:

正如第一个答案已经适当注意到的那样,在当前的示例案例中使用MVC是过度的.问题的目标是通过一个简单的例子来理解底层概念,以便能够在更大的程序中使用它们来修改更复杂的数据(数组,对象).


我试图在C++和QT中实现MVC模式,类似于这里的问题:

其他MVC问题

该程序有2行编辑:

  • mHexLineEdit
  • mDecLineEdit

3个按钮

  • mConvertToHexButton
  • mConvertoDecButton
  • mClearButton

并只修改字符串.

在此输入图像描述

与另一个问题的区别在于,我试图实现Subject/Observer模式,以便在模型更改后更新View.

Model.h

#ifndef MODEL_H
#define MODEL_H

#include <QString>
#include <Subject>

class Model : virtual public Subject
{
public:
    Model();
    ~Model();
    void convertDecToHex(QString iDec);
    void convertHexToDec(QString iHex);
    void clear();

    QString getDecValue() {return mDecValue;}
    QString getHexValue() {return mHexValue;}
private:
    QString mDecValue;
    QString mHexValue;
};
#endif // MODEL_H
Run Code Online (Sandbox Code Playgroud)

Model.cpp

#include "Model.h"

Model::Model():mDecValue(""),mHexValue(""){}
Model::~Model(){}

void Model::convertDecToHex(QString iDec)
{
    mHexValue = iDec + "Hex";

    notify("HexValue");
}

void Model::convertHexToDec(QString iHex)
{
    mDecValue = iHex …
Run Code Online (Sandbox Code Playgroud)

c++ model-view-controller qt

7
推荐指数
2
解决办法
2378
查看次数

Boost ASIO:服务器如何知道客户端是否仍然连接?

boost::asio用于服务器/客户端应用程序.服务器一次只接受一个连接.我想知道服务器验证客户端是否仍然连接的最佳方法是什么.

这样做的目的是,我希望能够知道客户端是否已崩溃,以便我可以重新开始侦听新的连接尝试.

c++ tcp boost-asio

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

使用boost :: bind和boost :: function:检索绑定变量类型

有没有办法检索有什么参数由boost :: bind限制的信息,还是需要手动存储?

即:

在.h

class MyClass
{
    void foo(int a);
    void foo2(double b);
    void bar();
    void execute();
    int _myint;
    double _mydouble;
}
Run Code Online (Sandbox Code Playgroud)

在.cpp

MyClass::bar()
{
    vector<boost::function<void(void)> myVector;
    myVector.push_back(boost::bind(&MyClass::foo, this, MyClass::_myint);
    myVector.push_back(boost::bind(&MyClass::foo2, this, MyClass::_mydouble);
}
MyClass::execute(char* param)
{

    boost::function<void(void)> f  = myVector[0];
    //MAGIC goes here
    //somehow know that an int parameter was bound
    _myint = atoi(param);
    //--------------------------------------
    f();
}
Run Code Online (Sandbox Code Playgroud)

c++ boost types

4
推荐指数
1
解决办法
1657
查看次数

使用#define时产生奇怪的mod运算符(%)

int temp1,temp2,temp3;
temp1 = 199;
temp2 = 200;
temp3 = 199%temp2;

CString txt;
txt.Format(_T("temp3 = %d"),temp3);
AfxMessageBox(txt);
Run Code Online (Sandbox Code Playgroud)

按预期输出199.

#define WIDTH 100
#define BUFFERWIDTH 200
int temp1,temp2,temp3;
temp1 = 199;
temp2 = BUFFERWIDTH;
temp3 = 199%BUFFERWIDTH;

CString txt;
txt.Format(_T("temp3 = %d"),temp3);
AfxMessageBox(txt);
Run Code Online (Sandbox Code Playgroud)

按预期输出199.

#define WIDTH 100
#define BUFFERWIDTH 2*WIDTH
int temp1,temp2,temp3;
temp1 = 199;
temp2 = BUFFERWIDTH;
temp3 = 199%BUFFERWIDTH;

CString txt;
txt.Format(_T("temp3 = %d"),temp3);
AfxMessageBox(txt);
Run Code Online (Sandbox Code Playgroud)

输出是100 ...

只是想知道是什么导致这个:)

c++ modulo c-preprocessor

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

将向量传递给模板函数

这是一个小函数,我正在尝试编写以跟踪我在函数中使用的动态分配(厌倦了一直编写delete []).

template <class T>
T* snew(int size, vector<T*> list)
{
    T* pointer = new T[size];
    list.push_back(pointer);
    return pointer;
}

vector<float*> list;
float* myfloat1 = snew<float*>(HEIGHT*WIDTH,list);
float* myfloat2 = snew<float*>(HEIGHT*WIDTH,list);
float* myfloat3 = snew<float*>(HEIGHT*WIDTH,list);
Run Code Online (Sandbox Code Playgroud)

那么当我需要清除内存时我可以使用:

template <class T>
void sdelete(vector<T*> list)
{
    vector<T*>::iterator it;
    for (it = list.begin(); it != list.end(); ++it){
        delete [] *it
        *it = NULL
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样:

sdelete<float*>(list);
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我得到:

cannot convert parameter 2 from 'std::vector<_Ty>' to 'std::vector<_Ty,_Ax>'
Run Code Online (Sandbox Code Playgroud)

不确定这意味着什么.感谢您的见解:)

c++ templates vector

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

Boost函数和boost绑定:绑定返回值?

这与前一个问题有关:使用boost :: bind和boost :: function:检索绑定变量类型.

我可以绑定一个这样的函数:

在.h:

class MyClass
{
    void foo(int a);
    void bar();
    void execute(char* param);
    int _myint;
}
Run Code Online (Sandbox Code Playgroud)

在.cpp

MyClass::bar()
{
    vector<boost::function<void(void)> myVector;
    myVector.push_back(boost::bind(&MyClass::foo, this, MyClass::_myint);
}
MyClass::execute(char* param)
{
    boost::function<void(void)> f  = myVector[0];
    _myint = atoi(param);
    f();
}
Run Code Online (Sandbox Code Playgroud)

但是如何绑定返回值呢?即:

在.h:

class MyClass
{
    double foo(int a);
    void bar();
    void execute(char* param);
    int _myint;
    double _mydouble;
}
Run Code Online (Sandbox Code Playgroud)

在.cpp

MyClass::bar()
{
    vector<boost::function<void(void)> myVector;
    //PROBLEM IS HERE: HOW DO I BIND "_mydouble"
    myVector.push_back(boost::bind<double>(&MyClass::foo, this, MyClass::_myint);
}
MyClass::execute(char* …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-bind boost-function

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

AfxMessageBox出现在MFC对话框后面

在我的应用程序的主视图中,我创建了一个无模式对话框,即:

CMyDialog dlg;
int returnval = dlg.doModal();
Run Code Online (Sandbox Code Playgroud)

现在这是我第一次发生这种情况,但是在这个特定的对话框中,如果我想在按下按钮时显示一个消息框,它总是出现在对话框的后面.如果我按下键盘上的alt键,它会获得焦点并出现在前面.

int nResult = AfxMessageBox(_T("Are you sure you want to delete this file?"), MB_YESNO|MB_ICONQUESTION|MB_SETFOREGROUND | MB_TOPMOST | MB_TASKMODAL);
if(nResult == IDNO){
    return;
}
else{
...
}
Run Code Online (Sandbox Code Playgroud)

我想知道我做了什么或我检查了哪些选项会导致这种行为?


编辑:这是我的OnInitDialog函数中的一小部分代码,我注释掉了所有其余的并且仍然存在相同的行为:

CDialog::OnInitDialog();
DEVMODE sDevMode;
ZeroMemory(&sDevMode, sizeof(DEVMODE));
sDevMode.dmSize = sizeof(DEVMODE);

EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&sDevMode);
_screenw = (int)sDevMode.dmPelsWidth;
_screenh = (int)sDevMode.dmPelsHeight;

_dlgx = (int) 50;
_dlgy = (int) 50;
_dlgw = (int) _screenw-100;
_dlgh = (int) _screenh-100;

this->MoveWindow(_dlgx,_dlgy,_dlgw,_dlgh);
Run Code Online (Sandbox Code Playgroud)

c++ mfc modal-dialog

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

将类对象指针传递给初始化C++的函数

让我说我有一个类"A"和这个功能:

void initializationFunction(A* classPointer)
{
    ...
    ...
    classPointer = new A(.....); 
}
Run Code Online (Sandbox Code Playgroud)

我写:

A* classPointer;
Run Code Online (Sandbox Code Playgroud)

然后我将此指针传递给此函数:

initializationFunction(classPointer);
Run Code Online (Sandbox Code Playgroud)

除非我在函数声明中通过引用传递它,否则这将不起作用:

void initializationFunction(A*& classPointer);
Run Code Online (Sandbox Code Playgroud)

我认为引用传递是非指针类型变量.我的意思是你不需要通过引用传递数组...

谢谢你的解释:)

c++ class pass-by-reference

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