小编Eve*_*one的帖子

为什么人们写私有字段getter返回非const引用?

我们都同意公共变量不利于封装以及所有这些.但是,我注意到有很多代码可以执行此类操作:

class foo {
private:
    int integer_;
    string someString_;
    // other variables
public:
    int& integer() { return integer_; }
    string& someString() { return someString_; }
    // other "functions"
}

int main() {
    foo f;
    f.integer() = 10;
    f.someString() = "something";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已经看到这在许多地方被使用,我不明白为什么.基本上它返回对数据的引用,从而将其直接暴露给外部.所以封装并没有真正实现,不是从任何角度来看.

为什么这个常用?

c++ getter encapsulation private-members getter-setter

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

了解托管C++

我无法理解托管C++如何工作和编译.

在.NET Framework中,您可以使用C#/ VB/F#/ ..等开发代码.并且所有这些语言都将编译为与Java字节码类似的相同公共中间语言(CIL).从理论上讲,CIL可以安装在任何平台上(Mono使其实用).在Windows上,CLR将CIL编译为本机代码Just-In-Time(JIT),一切运行顺利,好用.

现在,Managed C++如何编译?它是否编译为CIL代码并等待CLR使用JIT运行它?我认为不是,因为托管C++可以使用标准C++代码(不编译为CIL).此外,它如何使用.NET程序集(CIL)?

我将不胜感激任何帮助.谢谢

编辑:

我看到了这个答案.它指出,在C++/CLI中,托管代码被编译为MSIL,您可以选择将非托管代码编译为本机代码或MSIL.因此,我现在明白如何调用.NET程序集.

无论如何,如果将非托管代码编译为本机代码,我仍然不明白如何在同一程序集中使用托管代码运行C++非托管代码.有任何想法吗?

.net c++ clr cil managed

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

C++线程在完成执行后仍然是`joinable()`吗?

我有以下功能:

void threadProc(){
    for (int i = 0; i < 5; ++i) {
        std::cout << "\n  thread #" << std::this_thread::get_id() << " says hi";
    }
    std::cout << "\n  Finished executing thread #" << std::this_thread::get_id();
}
Run Code Online (Sandbox Code Playgroud)

我使用它的方式如下:

int main(){
    try {
        std::thread t1(threadProc);
        t1.join();

        std::thread t2(threadProc);
        HANDLE handle = t2.native_handle(); 
        WaitForSingleObject(handle, INFINITE);
        std::this_thread::sleep_for(std::chrono::milliseconds(5000));
        std::cout << "\n  thread t2 is joinable: " << std::boolalpha << t2.joinable() << "\n\n";
    }
    catch (std::exception& ex){
        std::cout << "\n\n  " << ex.what() << "\n\n";
    }
    return …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading lifetime

4
推荐指数
2
解决办法
2054
查看次数

用于线程同步的std :: atomic vs static变量

我有一堆线程正在处理多个数据项.线程必须按照我将数据传递给线程的相同顺序输出结果.那是:

Thread #1: give data - start processing
Thread #2: give data - start processing
Thread #3: give data - start processing
...
Thread #n: give data - start processing
Run Code Online (Sandbox Code Playgroud)

应该以与传递给线程的数据相同的顺序检索结果,而不管哪个线程首先完成处理.即:

Thread #1: put data 
Thread #2: put data
...
Run Code Online (Sandbox Code Playgroud)

为了区分线程并管理它们,我给每个人一个ID (0,1,2,...,n).我正在使用ID为每个线程分配数据,以便它可以处理它.

for(int i=0; i<thread_count; i++)
    give_data(i); // i is id and the function knows where to get data from
Run Code Online (Sandbox Code Playgroud)

我希望线程共享一个令牌,该令牌决定了预期产生结果的线程.所有线体都是相同的,主体看起来像:

while(true){
    auto data = get_data();
    result = process_data(data);
    while(token != this_id) spin;
    put_data(result); // this is a synchronized …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading synchronization atomic

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