我的问题与导出带有STL的C++类有关.例如:
class __declspec(dllexport) Hello
{
std::string name;
public:
std::string& getName();
void setName(const std::string& name);
}
Run Code Online (Sandbox Code Playgroud)
各种文章似乎表明这是非常糟糕的,这是很容易理解的.必须使用相同的编译器设置和CRT版本编译所有内容.否则一切都会崩溃和燃烧.
我不明白为什么只有数据成员似乎有问题.使用下面的代码,我得到:" C4251:需要让dll接口被类的客户端使用 "; 这显然是通过导出实例化的std :: string来修复的:
struct __declspec(dllexport) SomeClass
{
// Removes the warning?
// http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html
// template class __declspec(dllexport) std::string;
std::string name; // Compiler balks at this
}
Run Code Online (Sandbox Code Playgroud)
固定版本是:
// Export the instantiations of allocator and basic_string
template class __declspec(dllexport) std::allocator<char>;
template class __declspec(dllexport) std::basic_string<char, std::char_traits<char>, std::allocator<char> >;
struct __declspec(dllexport) SomeClass
{
std::string name; // No more balking!
}
Run Code Online (Sandbox Code Playgroud)
(当您尝试使用DLL时,这将为LNK2005"basic_string已定义",这意味着您不必在客户端上的CRT中链接 …
最近我遇到了一个问题:如何避免实例化Java类?
但是,我回答说:
如果您不想实例化类,请使用"abstract"修饰符.例如:javax.servlet.HttpServlet被声明为抽象(尽管它的方法都不是抽象的)以避免实例化.
声明一个无参数的私有构造函数.
现在我的问题是a)还有其他方法吗?b)为什么任何人都不想实例化一个类?-在SO搜索后,我从知道这个那个的Util类可以做出不实例化.我们不想在OOP中实例化一个类的任何其他地方?
要恢复已持久化的对象的状态,我想在不调用其构造函数的情况下创建该类的空实例,以便稍后使用Reflection设置属性.
我找到的唯一方法,就是Doctrine的做法,就是创建一个虚假的对象序列化,并对unserialize()它:
function prototype($class)
{
$serialized = sprintf('O:%u:"%s":0:{}', strlen($class), $class);
return unserialize($serialized);
}
Run Code Online (Sandbox Code Playgroud)
还有另一种不那么黑客的方法吗?
我期待在反思中找到这样的方式,但我没有.
我从Visual Basic来到Java,似乎认为我曾经在很多方面被宠坏了:p
有没有办法实例化一个对象并内联修改它?就像是:
JFrame aFrame = new JFrame();
aFrame.add(new JPanel() {.setSize(100,100) .setLocation(50,50) .setBackground(Color.red) });
Run Code Online (Sandbox Code Playgroud)
我能够使用@Override方法,但我正在寻找更简单的方法.我有很多搜索,但是如果有这种内联实例化的特定术语,它就会让我失望.
感谢您的时间!
我正在浏览我的OOP类文档,我发现了这个例子:
class Student {
private String name;
public int averageGrade;
public Student(String n, int avg) {
name = n;
averageGrade = avg;
}
public static void main(String[] args) {
Student s = new Student("John", 9);
}
}
Run Code Online (Sandbox Code Playgroud)
我发现它们正在从同一个类的主要实例化一个对象时感到困惑.这被认为是不好的做法吗?新创建的对象s是否有主方法?
谢谢!
鉴于这种:
Person.h:
@interface Person
{
}
- (void) sayHello;
@end
Run Code Online (Sandbox Code Playgroud)
Person.m:
#import "Person.h"
@implementation Person
- (void)sayHello
{
printf("%s", "Steve");
}
@end
Run Code Online (Sandbox Code Playgroud)
你如何实例化这个人?我试过这个:
Person *p = [Person new];
Run Code Online (Sandbox Code Playgroud)
这不起作用,也不是这样的:
Person *p = [Person alloc];
Run Code Online (Sandbox Code Playgroud)
[UPDATE]
我忘了告诉,我已经尝试从NSObject继承,新的和alloc工作.我只是好奇我们是否可以实例化一个不从NSObject继承的类?
这是C++ Primer第5版的练习:
练习16.27:对于每个带标签的语句,解释实例化发生的情况(如果有的话).如果模板被实例化,请解释原因; 如果没有,请解释原因.P.677
template <typename T> class Stack { };
void f1(Stack<char>); // (a)
class Exercise {
Stack<double> &rsd; // (b)
Stack<int> si; // (c)
};
int main() {
Stack<char> *sc; // (d)
f1(*sc); // (e)
int iObj = sizeof(Stack< string >); // (f)
}
Run Code Online (Sandbox Code Playgroud)
以下是我的尝试:
(a)Stack<char>被实例化,但没有实例化它的成员.
(b)Stack<double>被实例化,但没有实例化其成员.
(c)Stack<int>并实例化其默认构造函数.
(d)(e)完全不知道......
(f)Stack< string >被实例化,但没有实例化其成员.
我对吗?谁能告诉我这个代码是如何实例化的?
懒惰的线程安全单例实例对每个编码器来说都不容易理解,所以我想在我们的企业框架中创建一个可以完成这项工作的类.
你怎么看待这件事?你觉得它有什么坏处吗?在Apache Commons中有类似的东西吗?我怎样才能让它变得更好?
Supplier.java
public interface Supplier<T> {
public T get();
}
Run Code Online (Sandbox Code Playgroud)
LazyThreadSafeInstantiator.java
public class LazyThreadSafeInstantiator<T> implements Supplier<T> {
private final Supplier<T> instanceSupplier;
private volatile T obj;
public LazyThreadSafeInstantiator(Supplier<T> instanceSupplier) {
this.instanceSupplier = instanceSupplier;
}
@Override
// http://en.wikipedia.org/wiki/Double-checked_locking
public T get() {
T result = obj; // Wikipedia: Note the usage of the local variable result which seems unnecessary. For some versions of the Java VM, it will make the code 25% faster and for others, it won't hurt.
if …Run Code Online (Sandbox Code Playgroud) 假设someClass是在C#中使用某种方法定义的类int doSomething(void),为简单起见,提供不带参数的构造函数.然后,在C#中,必须在gc堆上创建实例:
someClass c; // legit, but only a null pointer in C#
// c->doSomething() // would not even compile.
c = new someClass(); // now it points to an instance of someclass.
int i = c->doSomething();
Run Code Online (Sandbox Code Playgroud)
现在,如果someClass编译成一些.Net库,你也可以在C++/CLI中使用它:
someClass^ cpp_gcpointer = gcnew someClass();
int i = cpp_gcpointer->doSomething();
Run Code Online (Sandbox Code Playgroud)
那简单!漂亮!这当然假设已经将.Net库的引用添加到项目中并且已经进行了相应的使用声明.
我的理解是,这是前一个C#示例的精确C++/CLI等效(缩写为单行,这不是我感兴趣的点).正确?(对不起,我是这个话题的新手)
但是,在C++中也是如此
someClass cpp_cauto; // in C++ declaration implies instantiation
int i = cpp_cauto.doSomething();
Run Code Online (Sandbox Code Playgroud)
是有效的语法.出于好奇,我今天试了这个.一位同事,看着我的肩膀,愿意打赌它甚至不会编译.他本可以输掉赌注.(这仍然是C#程序集中的类).实际上它产生的结果i与前面例子中的代码相同.
也很漂亮,但是 - 嗯 - 究竟是什么,这里创造了什么?我的第一个猜测是,在我的背后,.Net在gc堆上动态创建一个实例,并且cpp_auto是这个对象的某种包装器,其行为类似于类的实例someClass.但后来我找到了这个页面 …
相对较新的Java程序员和我已经被教导过你不能创建一个抽象类的实例.我也做了一些研究,我了解到在大多数情况下,当它出现一个抽象类时,它实际上是一个匿名的子类.但这是我遇到的问题:
Java的URL类有一个openConnection返回的方法URLConnection.URLConnection是一个抽象类,Java文档也将其所有子类列为抽象类......所以我真的迷失了.什么回来了?