小编Chr*_*ckl的帖子

为什么在Singleton类中使用私有析构函数?

我已经看到构造函数,复制构造函数,析构函数和赋值运算符保存在典型的单一类中的私有范围内.例如

class CMySingleton
{
public:
  static CMySingleton& Instance()
  {
    static CMySingleton singleton;
    return singleton;
  }

private:
  CMySingleton() {}                                  // Private constructor
  ~CMySingleton() {}
  CMySingleton(const CMySingleton&);                 // Prevent copy-construction
  CMySingleton& operator=(const CMySingleton&);      // Prevent assignment
};
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是

为什么要将析构函数和赋值运算符保留在私有范围内呢?这是强制性的吗?

公共析构函数是否会破坏单例类的任何属性?因为我们的对象构造受到限制所以不会有不必要的破坏.

我可以理解私有赋值运算符可以阻止自我赋值,但是除了额外的运行时间之外,公共赋值运算符是否还会受到伤害?

c++ singleton

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

带有unsigned char的for循环会产生意外行为

我正在练习面试问题,但我对这个基本问题很难:

这个循环执行多少次?

  unsigned char half_limit = 150;

  for (unsigned char i = 0; i < 2 * half_limit; ++i)
  {
      std::cout << i;
  }
Run Code Online (Sandbox Code Playgroud)

我的想法是,因为unsigned int只达到255,所以它将永远执行,因为当我在255处递增unsigned char时它将恢复为0?然而,这种想法是错误的,更奇怪的是,这是输出cout给我的:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????    
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下内容限制外观时:

if (i <= 255)
  std::cout << i;
else
  break;
Run Code Online (Sandbox Code Playgroud)

循环仍然是无限的.

我的问题是代码的预期结果是什么,为什么会这样?

c++

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

自 Visual Studio 15.6.2 编译器更新标准以来,新的 C++17 [[nodiscard]] 警告是否符合标准?

最近 Visual Studio Studio 升级到版本 15.6.2 包括一个 Visual C++ 编译器更新,由于以下原因,该更新会导致以下代码push_back行出现警告[[nodiscard]]

#include <vector>

struct [[nodiscard]] S
{
    int i;
};

int main()
{
    std::vector<S> v;
    v.push_back({ 1 }); // causes warning C4834
}
Run Code Online (Sandbox Code Playgroud)

编译器是这样调用的(注意不需要指定高警告级别来重现,但这/std:c++latest是必需的,并且/permissive-是可选的):

#include <vector>

struct [[nodiscard]] S
{
    int i;
};

int main()
{
    std::vector<S> v;
    v.push_back({ 1 }); // causes warning C4834
}
Run Code Online (Sandbox Code Playgroud)

警告来自 Visual C++ 自己的std::vector实现代码,并说:

cl /nologo /EHsc /permissive- /std:c++latest test.cpp
Run Code Online (Sandbox Code Playgroud)

(完整的警告输出见下文)

编译器版本:

warning C4834: discarding …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++ language-lawyer c++17

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

C++在#include指令中使用..(点点)是否合法?

那里.正如标题所说.

使用#include"test.h"是合法的.
使用#include"test/test.h"也是合法的.
但使用合法#include"../test.h"吗?

例如,#pragma once几乎每个编译器都是合法的.
但这不是C++的标准.

我找不到任何说"保证"是父目录含义的文件.
谁能帮我?

c++ include include-path

3
推荐指数
1
解决办法
614
查看次数

c ++遍历字符串向量

所以我最近发现了地图和矢量的使用,但是,我试图想办法循环一个包含字符串的向量.

这是我尝试过的:

#include <string>
#include <vector>
#include <stdio>

using namespace std;

void main() {
    vector<string> data={"Hello World!","Goodbye World!"};

    for (vector<string>::iterator t=data.begin(); t!=data.end(); ++t) {
        cout<<*t<<endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我收到此错误:

cd C:\Users\Jason\Desktop\EXB\Win32
wmake -f C:\Users\Jason\Desktop\EXB\Win32\exbint.mk -h -e
wpp386 ..\Source\exbint.cpp -i="C:\WATCOM/h;C:\WATCOM/h/nt" -w4 -e25 -zq -od    -d2 -6r -bt=nt -fo=.obj -mf -xs -xr
..\Source\exbint.cpp(59): Error! E157: col(21) left expression must be integral
..\Source\exbint.cpp(59): Note! N717: col(21) left operand type is 'std::ostream watcall (lvalue)'
..\Source\exbint.cpp(59): Note! N718: col(21) right operand type is 'std::basic_string<char,std::char_traits<char>,std::allocator<char>> (lvalue)'
Error(E42): …
Run Code Online (Sandbox Code Playgroud)

c++ vector watcom

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

如何在c ++中将精度设置为100位?

对不起,我有一个非常基本的问题.

这是一个非常简单的计算,一个整数(22)除以另一个整数(7).我希望c ++代码在代码内部和输出值中的实际计算中都使用精确的100位精度.使用Maple程序,我得到了

restart;
Digits:=100;
evalf(22/7);
Run Code Online (Sandbox Code Playgroud)

我得到的答案是,

3.142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857143
Run Code Online (Sandbox Code Playgroud)

但我使用以下c ++代码并得到一些不同的答案.这只是在几个实际数字之后添加零,这是完全错误的.下面是我的c ++代码.

#include <iostream>
 using namespace std;
 int main()
 {
     cout << fixed;
     cout.precision(100);
     cout << "22/7 = " << 22/(double)(7) << endl;
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
166
查看次数

如何在c ++中导入所有#include?

我正在制作一个C++程序,而我正在尝试导入所有内容#include.但我尝试的东西不起作用.我想我可能会对Python的import *功能感到困惑.

这是我的代码:

#include <*>

using namespace std;

int main()
{
    cout << Hello! << endl;
    return 0
}
Run Code Online (Sandbox Code Playgroud)

那么,我打开了cmd并键入:

c++ test.cpp -o test.exe
Run Code Online (Sandbox Code Playgroud)

这就是我得到的错误......

Microsoft Windows [Version 10.0.16299.309]
(c) 2017 Microsoft Corporation. All rights reserved.

C:\Users\thoma>cd Desktop

C:\Users\thoma\Desktop>c++ test.cpp -o test.exe
test.cpp:1:13: fatal error: c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\*: Invalid argument
 #include <*>
             ^
compilation terminated.

C:\Users\thoma\Desktop>
Run Code Online (Sandbox Code Playgroud)

我的编译器是MinGW.任何帮助或答案将不胜感激.

c++

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

如何正确使用这个迭代器?

我正在尝试使用容器来存储字符串的迭代器s,但是当我运行它时我遇到了段错误.正如您将在下面看到的那样,错误似乎随之而来char temp = **itbegin;,这可能意味着我无法通过前一个迭代器分配任何值.

为什么?我是否误用了迭代器?如何正确使用迭代器?

#include <iostream>
#include <vector>
using namespace std;
string reverseVowels(string s);

int main()
{
    string s ="hello";
    cout << reverseVowels(s);
}
string reverseVowels(string s) {
    string::iterator iter = s.begin();
    string::iterator iterend = s.end();
    vector<string::iterator> iteratorbox;
    for(;iter != iterend ; ++iter){
        if((*iter) == 'a' &&
           (*iter) == 'e' &&
           (*iter) == 'i' &&
           (*iter) == 'o' &&
           (*iter) == 'u'){
               iteratorbox.push_back(iter);
           }

    }
    auto itbegin = iteratorbox.begin();
    auto itend =   iteratorbox.end() ;
    --itend; …
Run Code Online (Sandbox Code Playgroud)

c++ containers stl c++11

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

模板类的编译错误

我尝试使用下面的代码片段并得到如下所述的编译错误

代码片段:

#include <iostream>

using namespace std;

template <class TYPE1>
struct SDataContainer
{
    SDataContainer(TYPE1 pData)
    {
        m_pData = pData;
    }

    bool operator==(const SDataContainer<TYPE1>& pData)
    {
        return (m_pData == pData.m_pData);
    }

    TYPE1 m_pData;
};
template <class DATATYPE1>
class Comparison
{
    public:
        Comparison (const SDataContainer<DATATYPE1>& pSData)
        {
            m_SData = pSData;
        }
        bool operator==(const Comparison<DATATYPE1>& pData)
        {
            return (m_SData.m_pData == pData.m_SData.m_pData);
        }
        SDataContainer<DATATYPE1> m_SData;
};
int main()
{
    SDataContainer<float> sDCObj1 (10.0);
    SDataContainer<float> sDCObj2 (10.0);
    cout << "Verify the data: " << (sDCObj1 == …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

为什么围绕函数参数括号?

我正在从计算机系统程序员的角度研究2.1节,我理解代码在做什么,但我不明白为什么围绕形式参数"byte_pointer"后跟&x有括号?

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, int len) {
    int i;
    for (i = 0; i < len; i++)
        printf(" %.2x", start[i]);
    printf("\n");
}

void show_float(float x) {
    show_bytes((byte_pointer) &x, sizeof(float));
}

void show_int(int x) {
    show_bytes((byte_pointer) &x, sizeof(int));
}

void show_pointer(void *x) {
    show_bytes((byte_pointer) &x, sizeof(void *));
}
Run Code Online (Sandbox Code Playgroud)

c parameters function

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