小编hmj*_*mjd的帖子

带向量,指针的C++析构函数,

据我所知,我应该在析构函数中销毁我创建的所有内容new并关闭打开的文件流和其他流.但是,我对C++中的其他对象有些怀疑:

  • std::vectorstd::strings:它们会自动销毁吗?

  • 如果我有类似的东西

    std::vector<myClass*> 
    
    Run Code Online (Sandbox Code Playgroud)

    指向类的指针.调用向量析构函数时会发生什么?
    它会自动调用析构函数myClass吗?或者只有矢量被破坏,但它包含的所有对象仍然存在于内存中?

  • 如果我有一个指向类中另一个类的指针会发生什么,比如说:

    class A {
      ClassB* B;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    并且在代码中的某个点销毁A类.B类是否会被销毁,或者只是指针和B类仍将存在于内存的某个地方?

c++ destructor

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

String.equals()参数排序

我最近在最近的回答中收到了使用以下内容的downvote :

String word = ...;
if ("s".equals(word) || "y".equals(word)
Run Code Online (Sandbox Code Playgroud)

由于使用"yoda条件"而给出了downvote.我要求进一步解释,但没有提供.我更喜欢这种风格以避免可能NullPointerException.

这是一种糟糕的编码风格吗?如果是这样,为什么?

java

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

创建一个新的C++子向量?

假设我有一个值为[1,2,3,4,5,6,7,8,9,10]的向量.我想创建一个新的向量,例如,[5,6,7,8].我想这只是用指针创建一个向量的问题,还是我需要push_back所需的所有中间值?

c++ vector

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

使用同一个类中的函数在类中创建线程

我希望能够定义一个包含一些数据成员的类,以及一个可以访问那些私有数据成员的函数.

然后我想要一个公共函数,它创建一些线程,它们对类的数据成员进行操作.我在编译代码时遇到了一些麻烦.

不要担心互斥或数据保护,这不会成为问题,因为这只是一些用于测试的示例代码.

class foo {
    public:
    void make_foo_func_threads();

    private:
    void foo_func();

    char private_data;
    std::vector<std::thread> some_threads;
}

void foo::foo_func() {
    while(1) {
        private_data = 'A';
    }
}

void foo::make_foo_func_thread() {
    for(...) some_threads.push_back(std::thread(foo_func));
    for(...) some_threads.join();
}
Run Code Online (Sandbox Code Playgroud)

编译器给我错误:

'没有匹配调用std :: thread :: thread()'

显然有"用于从参数1没有已知的转换<unresolved overloaded function type>void (foo::*&&)'.

嗯,是的,我不知道这意味着什么除了编译器在理解如何解决foo_func方面有困难 - 我想.

我如何帮助编译器理解我想要做什么,所以它不会再困扰我了.毫无疑问,我写的代码是不合法的,如果是这样,有人可以解释为什么对我来说就是这种情况.谢谢!

c++ multithreading c++11

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

如何获得子流程的返回代码

从Windows中生成子流程获取返回值的方法是什么?它看起来ShellExecute()比使用起来更简单CreateProcess(),但是从我到目前为止所做的阅读中,都没有说明如何检查衍生过程的返回值.怎么做的?

谢谢,安迪

c++ winapi

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

不使用#define的全局常量

好吧,我希望将一组内存地址定义为.h文件中的常量,这些常量由一堆.c文件使用(我们在C中,而不是C++).我希望能够看到变量的名称,而不是只看到调试器中的十六进制地址......所以我想将我目前拥有的#defines转换为全局范围的常量.问题是,如果我这样定义它们:

const short int SOME_ADDRESS  =  0x0010
Run Code Online (Sandbox Code Playgroud)

然后我得到了可怕的"多声明"错误,因为我有多个.c文件使用相同的.h.我想使用枚举,但这不起作用,因为它默认为整数(在我的系统上是16位......我需要对类型有更好的控制).

我想把所有的地址都放在一个结构中...但我没有办法(我知道)在头文件中设置结构实例的默认值(我不想假设一个特定的.c文件首先使用结构并在其他地方填充它.我真的想在.h文件中定义常量)

我开始时看起来很简单,但是我没有看到在头文件中定义全局可用的short int常量的好方法......有谁知道这样做的方法?

谢谢!

c variables global header constants

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

将char转换为double

好的,我有char一个数字.我怎么能把它转换成double

char c;
Run Code Online (Sandbox Code Playgroud)

我试过了(double)c,但它转换为零.

有任何想法吗?

c

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

模板化操作符实例化和类型转换

这对于那里的C++大师来说.

请考虑以下代码:

class X { };

template <class T>
class Mistake {
public:
  T x;

  Mistake(const T& k) : x(k) { }
  Mistake(const X&) : x(1) { }

  void print() { cout << x << endl; }
};

template <class T>
Mistake<T> operator+(const Mistake<T>& a, const Mistake<T>& b)
{
  return Mistake<T>(a.x + b.x);
}
Run Code Online (Sandbox Code Playgroud)

我有一个类"错误",我想要进行加法操作.当我尝试:

X a, b;
Mistake<int> foo = a + b;
Run Code Online (Sandbox Code Playgroud)

我收到编译错误; 编译器似乎无法意识到必须实例化模板运算符+.

另一方面,如果我之前添加以下代码:

Mistake<int> operator+(const Mistake<int>& a, const Mistake<int>& b)
{
  return Mistake<int>(a.x + b.x);
} …
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading operator-keyword

13
推荐指数
1
解决办法
157
查看次数

如何检查枚举变量是否有效?

我有一个枚举:

enum myenum{
  typeA,
  typeB,
  typeC
} myenum_t;
Run Code Online (Sandbox Code Playgroud)

然后,使用enum参数调用函数:

int myfunction(myenum_t param1)
{
  switch(param1)
  {
    case typeA:
    case typeB:
    case typeC:
      //do the work
      break;

    default:
      printf("Invalid parameter");
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,随着myenum_t越来越多的价值观的增长,myfunction似乎并不那么优雅.

有没有更好的方法来检查枚举是否有效?

c enums

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

移动成员函数生成

码:

#include <iostream>
#include <ios>
#include <string>
#include <type_traits>
#include <memory>

struct value
{
    ~value() = default;
    std::unique_ptr<std::string> s;
};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_move_constructible<value>::value << '\n';
    std::cout << std::is_move_assignable<value>::value    << '\n';

    using str_ptr = std::unique_ptr<std::string>;
    std::cout << std::is_move_constructible<str_ptr>::value << '\n';
    std::cout << std::is_move_assignable<str_ptr>::value    << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出(使用g ++ v4.7.2编译,http://ideone.com/CkW1tG ):

false
false
true
true

正如我所料,value不是可移动的,也不是可移动的,因为:

~value() = default;
Run Code Online (Sandbox Code Playgroud)

是一个用户声明的析构函数,它根据第12.8节(见下文)阻止隐式生成移动成员.如果析构函数被删除,那么value就像我期望的那样(http://ideone.com/VcR2eq)可移动构造并移动可分配.

但是,当定义value …

c++ language-lawyer c++11

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