在阅读TCPL时,我遇到了一个问题,正如标题所述,然后'私有'类是:
class Unique_handle {
private:
Unique_handle& operator=(const Unique_handle &rhs);
Unique_handle(const Unique_handle &rhs);
public:
//...
};
Run Code Online (Sandbox Code Playgroud)
使用代码是:
struct Y {
//...
Unique_handle obj;
};
Run Code Online (Sandbox Code Playgroud)
我想执行这样的操作:
int main()
{
Y y1;
Y y2 = y1;
}
Run Code Online (Sandbox Code Playgroud)
虽然,这些代码来自TCPL,但我仍然无法得到解决方案......任何人都可以帮助我,欣赏.
我想从一个我将在运行时确定的类调用静态方法,但我知道它是给定类的子类.所以我要说我有这些课程
class super {
public:
super();
static super *loadMe (ifstream &is);
}
class subA : public super {
public:
subA();
static super *loadMe (ifstream &is);
}
class subB : public super {
public:
static super *loadMe (ifstream &is);
private:
subB();
}
Run Code Online (Sandbox Code Playgroud)
让我们说我想在运行时(根据文件中的内容)确定是否要加载subA或subB.我可以这样做的一种方法是使用一个空对象来调用该方法
super getLoadType (ifstream &is) { if(complicatedFunctionOfIs(is)) return subA(); return subB()}
super *newObj = getLoadType(is).loadMe(is);
Run Code Online (Sandbox Code Playgroud)
但是我把subB的无参数构造函数设为私有,所以我不能在这里做.但我实际上并不需要超级对象,只需要超类的类类型.那么有没有办法将其表示为变量?
编辑:我知道在这种情况下,我可以返回一个函数指针,但我正在考虑更复杂的例子,可能需要调用多个静态函数.
假设我正在构建一个不可变的 Yahtzee 记分卡类:
public final class Scorecard {
private Map<Category, Integer> scorecard = new HashMap<Category, Integer>();
public Scorecard() {
// Instantiates a new empty scorecard
}
private Scorecard(Map<Category, Integer> scorecard) {
this.scorecard = scorecard;
}
public Scorecard withScore(Category category, int[] roll) {
newScorecard = new HashMap<Category, Integer>(scorecard); // Pretend that this is a deep-copy
newScorecard.put(category, calculateScoreFromRoll(roll));
return new Scorecard(newScorecard);
}
public int getScore(Category category) {
return scorecard.get(category);
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我不想暴露类的内部结构。如果我没有私有构造函数,那么我将需要使用带有私有构造函数的公共构造函数Map(并且我也可能会丢失该withScore()方法)以便进行评分。但这是一种有效的工厂方法吗?
我是C++的新手,我正在尝试使用LinkedListIterator实用程序类编写LinkedList类,如下所示.(我只列出了与问题相关的代码部分).我已将LinkedListIterator构造函数创建为私有.
现在,当我在main()中有这两行时,
LinkedListIterator iter = list->begin(); <<== No compilation error
LinkedListIterator iter2; <<==== compilation error.
Run Code Online (Sandbox Code Playgroud)
我得到第二行的编译错误,这是默认构造函数是私有的.但是,我不明白为什么第一行没有编译错误?为什么?什么叫代码的第一行?私有构造函数或复制构造函数或赋值运算符?
class LinkedListIterator {
public:
bool operator== (LinkedListIterator i) const;
bool operator!= (LinkedListIterator i) const;
void operator++ (); // Go to the next element
int& operator* (); // Access the current element
inline Node* hasnext();
inline Node* next();
private:
LinkedListIterator(Node* p); <<==== Private constructor
LinkedListIterator(); <<==== Private constructor
Node* p_;
friend class LinkedList;//LinkedList can construct a LinkedListIterator
};
....
inline LinkedListIterator::LinkedListIterator(Node* p)
: p_(p) …Run Code Online (Sandbox Code Playgroud) 我需要序列化一个不能更改其源代码的类(将其视为事实),并且它来自不同的程序集。它只有一个构造函数
public class MyObject
{
string _s;
int _i;
internal MyObject(string s, int i)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
JsonConvert.SerializeObject(object)因此当然会失败。我想知道是否有一种方法可以使用Json.NET来序列化此类,而不必向其添加代码甚至标记。
我读到,从构造函数是私有的类创建子类是不可能的,但奇怪的是我能够做到这一点,这个代码片段还有更多内容吗?
请有人提供易于理解和满意的解释.
public class app {
public static void main(String[] args) {
app ref = new app();
myInheritedClass myVal = ref.new myInheritedClass(10);
myVal.show();
}
int myValue = 100;
class myClass {
int data;
private myClass(int data) {
this.data = data;
}
}
class myInheritedClass extends myClass {
public myInheritedClass(int data) {
super(data);
}
public void show() {
System.out.println(data);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在https://www.compilejava.net/上运行了这个片段,输出为10.
我一直读到私有构造函数会阻止对象创建。我在单例模式中使用过它们,我知道如何在使用私有构造函数(使用静态方法等)时创建对象。我知道构造函数用于对象的初始化。
但我不明白是什么让私有构造函数阻止对象创建。如果我的对象没有被初始化怎么办。我的意思是它应该扔一些垃圾但为什么它会限制?
我已经检查了 stackoverflow 中的所有现有答案,但我没有得到确切的概念。
全部,
我正在使用 C++14,并且正在制作一个或多或少的标准单例。我正在使用最新的 Visual Studio 2017。此代码有效:
#include <memory>
class A
{
public:
static A& getInstance()
{
if (instance == nullptr)
instance = std::unique_ptr<A>(new A());
return *instance;
}
private:
A() {}
static std::unique_ptr<A> instance;
};
std::unique_ptr<A> A::instance = nullptr;
Run Code Online (Sandbox Code Playgroud)
但是,当我将单例实例的创建更改为:
instance = std::make_unique<A>();
Run Code Online (Sandbox Code Playgroud)
我在尝试访问私有成员时收到编译错误:
Error C2248 'A::A': cannot access private member declared in class 'A'
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.14.26428\include\memory 2510
Run Code Online (Sandbox Code Playgroud)
这对我来说感觉像是一个错误,因为这两种形式在功能上应该是相同的?想法?
我在面试中面临以下问题。
Q1.抽象类中可以有私有构造函数吗?
答案-是的,我给了一个答案,我们可以有那么他再次问为什么,什么是使用私有构造的。我无法回答这个交叉问题。有人可以解释一下吗?实际上在 c# 中会有很大帮助。
我想将构造函数及其字段隐藏在一个类中,并且只使用伴随对象创建实例,但我无法实现。我有 Scala 2.13.3,它基于 java 8。这是一个代码示例:
斯卡拉
package X
object A {
def apply(x: Int): A = A(Seq(x))
}
case class A private(private val s: Seq[Int])
Run Code Online (Sandbox Code Playgroud)
甜菜
package Y
import X.A
class B {
val b = A(Seq.empty)
}
Run Code Online (Sandbox Code Playgroud)
虽然我只想让apply(x:Int)这段代码可见,但编译后的私有构造函数也是可见的。如何更改此代码以按预期工作?
scala access-modifiers private-constructor case-class companion-object
还有一个问题,转到我!...无论如何,我有两个私有构造函数和静态函数的类来返回该类的实例.一切都很好,我有一个main.cpp文件,我设法得到我的gameState对象指针,通过这样做:
gameState *state = gameState::Instance();
Run Code Online (Sandbox Code Playgroud)
但现在我似乎遇到了问题.为方便起见,我希望gameState实例和actionHandler实例都保留指向对方的副本.所以我试图在彼此的头文件中包含:
gameState *state;
Run Code Online (Sandbox Code Playgroud)
和
actionHandler *handler;
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不起作用......我得到"错误C2143:语法错误:缺少';' 在这两行之前的'*'"错误之前......如果该类有私有构造函数,你能否在头文件中定义某个classe的变量?或者是其他问题?或许是因为指向teh实例的指针存储为静态成员?
编辑:谢谢你们!令人惊讶的是我最近几天获得的c ++知识量很多......真棒!
这是我的问题.我想有一个私有构造函数的类,可以使用多个静态方法创建,就像Box.createHorizontalBox().它变得复杂的地方是这个类使用泛型.
请告诉我如何正确地做到这一点:
private WorkFlow(int _arrowSize) {
this.arrowSize = _arrowSize;
this.elements = new ArrayList<T>();
}
public static WorkFlow<T> createHorizontalWorkFlow<T>(int _arrowSize) {
WorkFlow<T> workFlow = new WorkFlow<T>(_arrowSize);
workFlow.vertical = false;
return workFlow;
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:Eclipse强调了intfrom createHorizontalWorkFlow<T>(int _arrowSize)并给了我错误Syntax error on token(s), misplaced construct(s)
出于任何原因,我有一个静态方法创建的对象,它调用私有构造函数.(它不是单身人士)
我想创建一个新对象派生自第一个,它有更多的成员和函数.
但这是有问题的,因为静态方法返回一个firstObject*对象,因此使用向下转换的创建secondObject*会使内存溢出.
我该怎么办?我可以访问第一个对象的代码,但是无法更改其构造函数(如果我更改它,我将不得不更改一个巨大的编写代码).
编辑:
感谢所有响应者.我可以更改要保护的构造函数.
c++ ×7
java ×3
c# ×2
c++14 ×1
case-class ×1
casting ×1
class ×1
constructor ×1
generics ×1
immutability ×1
inheritance ×1
json.net ×1
memory ×1
oop ×1
scala ×1
singleton ×1
subclass ×1
unique-ptr ×1