标签: static-members

试图使用静态方法/成员

在过去的几年里,我被C#编码所困扰,现在我又回到了C++,并发现我遇到的问题很简单.我正在使用名为DarkGDK的gamedev的第三方库(任何以db为前缀的命令),但DGDK不是问题.

继承我的代码:

system.h中

#pragma once

#include <string>
#include <map>
#include "DarkGDK.h"

using namespace std;

class System
{
public:
    System();
    ~System();
    void Initialize();

    static void LoadImage(string fileName, string id);
    static int GetImage(string id);

private:
    map<string, int> m_images;
};
Run Code Online (Sandbox Code Playgroud)

System.cpp

#include "System.h"

System::System()
{
}

System::~System()
{
}

void System::Initialize()
{
    dbSetDisplayMode (1024, 640, 32);
    dbSetWindowTitle ("the Laboratory");
    dbSetWindowPosition(100, 10);

    dbSyncOn         ();
    dbSyncRate       (60);

    dbRandomize(dbTimer());
}

void System::LoadImage(string fileName, string id)
{
    int i = 1;

    while (dbImageExist(i))
    {
        i++;
    }

    dbLoadImage(const_cast<char*>(fileName.c_str()), …
Run Code Online (Sandbox Code Playgroud)

c++ static-methods static-members

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

为什么必须在main()之外初始化静态成员?

为什么这在C++中无效?

class CLS
{
public:
    static int X;
};

int _tmain(int argc, _TCHAR* argv[])
{
    CLS::X=100;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ static-members

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

需要静态变量及其在jvm上的开销

根据静态成员的概念,当第一次调用它的类时,它们被创建/加载到内存中.它们在该类的所有实例中都很常见.意味着它们不会被重新创建或重新初始化等.此外,它们只能通过类名访问.不需要为该类创建对象来访问它们.

现在我的问题是;

  1. 在应用程序运行之前,静态成员是否一直在内存中?即使该类的所有实例都已被GC(垃圾收集器)收集.
  2. 对于一个大型项目,8-10个团队在一起工作,他们不关心其他团队的编码.他们可以根据需要创建静态成员.如果所有成员都缓存在内存中,它是否会在JVM上创建开销?
  3. 默认情况下,接口的所有成员都是STATIC,并且在许多情况下接口的使用都很好.但如果我记住上面的问题,我还应该使用接口吗?

java jvm interface static-members

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

加载类时未初始化静态变量

我有一个关于初始化的有趣问题.我有以下代码:

public class ErrorLookupProvider {  

private static final ErrorLookupProvider INSTANCE = new ErrorLookupProvider();

private  static Map<Long, List<String>> map = new HashMap<Long, List<String>>();

    private ErrorLookupProvider() {
        init();
    }

    private void init() {
        map.put(123L, ImmutableList.of("abc", "def"));
    }

    public static ErrorLookupProvider getInstance() {
        return INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我打电话时ErrorLookupProvider.getInstance(),我打了一个NPE.里面的地图init()没有用new初始化HashMap.

如果我将声明更改map为final,那么我会看到它已初始化.或者,即使我删除静态并使其成为私有类变量private Map<.....>也是如此.

我无法弄清楚为什么会这样.有人能解释一下这里发生了什么吗?

java initialization static-members

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

命名静态对象的名称

我在C++中看到了关于动态链接的这篇文章.

我们可以创建一个C++工厂,它将返回我们感兴趣的类的对象.此外,我们应该在工厂的文件范围内创建一个静态对象,以便可以使用它来定位它dlsym().(文章建议静态对象不会受到名称损坏.)

为什么静态对象没有名称损坏?

c++ static-members name-mangling dynamic-linking

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

访问静态变量和方法时C#和Java的区别

在Java中,静态方法和变量可以通过对象引用访问,就像在下面的程序中一样,它工作得很好:

//StaticDemo.java
class StaticVerifier{
    private int a,b;
    public StaticVerifier(int a,int b){
        this.a = a;
        this.b = b; 
        System.out.println("Values are "+this.a+" "+this.b);
    }   
    public static void takeAway(){
        System.out.println("This is a static method...");
    }
}
public class StaticDemo{
    public static void main(String[] args){
        StaticVerifier sv = new StaticVerifier(3,4);
        sv.takeAway();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在C#中转换相同的代码时,它不允许对象访问静态方法并给出编译时错误.请参阅下面的代码和相关错误:

//StaticDemo.cs
using System;
public class StaticVerifier{
    private int a,b;
    public StaticVerifier(int a,int b){
        this.a = a;
        this.b = b; 
        Console.WriteLine("Values are "+this.a+" "+this.b);
    }   
    public static void takeAway(){
        Console.WriteLine("This is …
Run Code Online (Sandbox Code Playgroud)

c# java static-members

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

类中静态成员的地址

如何在C++中获取类的私有静态成员的内存地址.在下面的代码中,我通过他们的内存地址直接访问类的私有成员.

#include <iostream>

class directM {
    int a;
    int b;
public:
    directM(int aa , int bb){
        a = aa;
        b = bb;
    }
    void show(){
        std::cout << a << b << std::endl;
    }
};

int main(){
    directM dm(10,20);
    dm.show();
    *(int*)( &dm ) = 15;
    *(int*)( ( (int*)(&dm) ) + 1 ) = 25;
    dm.show();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我更改其中一个成员并使其成为静态,即

static int b;

现在我如何能够通过其地址直接访问此私有成员.

注意: - 我知道这是一种非常不明智的方式来访问数据,我不是用它来解决任何问题.这只是一个学习练习,可以更好地了解语言.

c++ static pointers class static-members

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

嵌套类中的静态成员是否具有封闭类的静态持续时间?

如果我有嵌套类,并且这些嵌套类具有静态成员,那些成员对于封闭类仍然是静态的吗?例如,如果我有

class Enclosing {
public:
    Enclosing();
private:
    class Nested {
    public:
        Nested();
    private:
        static int thing;
    };
};
Run Code Online (Sandbox Code Playgroud)

如果我做

auto A = Enclosing();
auto B = Enclosing();
Run Code Online (Sandbox Code Playgroud)

愿意A并且B能够拥有不同的价值观thing吗?

c++ static-members inner-classes

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

是否可以在编译时加载/读取shape_predictor_68_face_landmarks.dat?

我正在尝试使用DLIBface_landmark_detection_ex.cppVisual Studio中构建C++应用程序.构建应用程序从命令promt运行,经过训练的模型和映像文件作为参数传递.

face_landmark_detection_ex.exe shape_predictor_68_face_landmarks.dat image.jpg
Run Code Online (Sandbox Code Playgroud)

shape_predictor_68_face_landmarks.dat是68个地标的训练模型,用于对输入图像执行检测,并且每次都需要在运行时加载以执行任何检测.我正在尝试做以下事情.

  • 在构建应用程序或编译时加载此 shape_predictor_68_face_landmarks.dat.
  • 在代码中读取shape_predictor_68_face_landmarks.dat,这样每次我的应用程序执行时,都不会占用更多的内存.

有没有办法在我的应用程序中打包此文件,以便运行更少的物理内存.

更新:

如何将此shape_predictor_68_face_landmarks.dat文件存储在静态缓冲区中,以便每次shape_predictor都可以从此缓冲区读取.

c++ memory-management file static-members dlib

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

googletest中的参数化和共享资源测试

我使用googletest框架尝试创建一个继承的Fixture类,以进行参数化和共享资源测试。

class FixtDBadminConnShared : public ::testing::Test {
  public:
    static void SetUpTestCase() {
      shared_conn_ = new ::DB::DB_connection();
    }
    static void TearDownTestCase() {
      delete shared_conn_;
    }
    static ::DB::DB_connection * shared_conn_;
    };
::DB::DB_connection * FixtDBadminConnShared::shared_conn_ = nullptr;

class FixtDBadminConnExec :public FixtDBadminConnShared, public ::testing::TestWithParam<string> 
  {
  protected:
    using FixtDBadminConnShared::SetUpTestCase;
    using FixtDBadminConnShared::TearDownTestCase;

    void SetUp() override {
      query_ = GetParam();
    }
    string query_;
  };       
Run Code Online (Sandbox Code Playgroud)

尝试调用测试:

TEST_P(FixtDBadminConnExec, SelectWithoutParam) {
 //do smth
}
INSTANTIATE_TEST_CASE_P(QueriesOrbital0param, FixtDBadminConnExec,
::testing::Values( string{ "SELECT * from my_table;" }));
Run Code Online (Sandbox Code Playgroud)

我收到下一个错误

Error   C2594   'return': ambiguous conversions from …
Run Code Online (Sandbox Code Playgroud)

c++ templates static-members googletest

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